피드로 돌아가기
Spark Connect on Kubernetes #1: 견고한 Spark Connect 만들기
토스 기술블로그토스 기술블로그
Infrastructure

Spark Connect on Kubernetes #1: 견고한 Spark Connect 만들기

Spark Connect 기반 멀티세션 서버의 SPOF 제거 및 리소스 격리 구조 설계

2026년 6월 19일22advanced

Context

Classic Spark의 App당 Driver 생성 구조로 인한 무거운 클라이언트 의존성과 느린 세션 생성 속도 해결을 위해 Spark Connect 도입. 하지만 long-running 서버 하나에 다수 세션이 연결되는 구조로 인해 단일 Driver JVM 장애가 전체 세션으로 전파되는 SPOF 문제와 FIFO 기반의 리소스 경합 발생.

Technical Solution

  • 글로벌 Executor 실패 카운터(spark.executor.maxNumFailures)를 사실상 무한대로 설정하여 특정 쿼리 실패로 인한 서버 전체 종료 방지
  • spark.task.maxFailuresspark.stage.maxConsecutiveAttempts 설정을 통해 글로벌 카운터 대신 개별 Task/Stage 단위의 Fault Tolerance로 장애 격리
  • 서버 스레드에 사용자별 Scheduler Pool을 직접 주입하는 방식으로 Spark Connect의 기본 설계 공백을 메워 Task 슬롯 할당 우선순위 제어
  • Gateway와 Controller를 둔 Hub 구조를 도입하고 Redis 기반의 Instance Store로 서버 상태를 공유하여 데이터 플레인의 K8S API 의존도 제거
  • Driver Heap 공유로 인한 OOM 방지를 위해 maxResultSize, memoryOverhead 및 Broadcast Join 임계값을 보수적으로 제한

- Spark Connect 운영 시 `spark.executor.maxNumFailures` 비활성화를 통한 서버 생존성 확보 검토 - Driver Heap 공유 환경에서 `spark.ui.store.path`를 디스크(RocksDB)로 분리하여 메모리 압박 완화 - 멀티 테넌트 환경의 경우 Scheduler Pool 설정을 통한 최소한의 Task 슬롯 경합 제어 적용 - Gateway-Controller-Redis 구조를 통한 서비스 디스커버리 최적화 및 K8S API 부하 분산 설계

원문 읽기