
아래 7개만 모아도 “메모리 이슈인지/쿼리 구조 문제인지/클러스터 스펙 문제인지”가 빨리 갈립니다.
Driver/Executor 기본 아키텍처를 모르면 트리아지가 느려져서, 운영자는 아래 그림 수준만 알고 있으면 충분합니다. Source
이미지: Apache Spark 문서 Source
에러 메시지로 1차 분류합니다.
OutOfMemoryError: Java heap spaceGC overhead limit exceededExecutorLostFailure ... heartbeat timed outDatabricks Spark UI 가이드는 긴 stage 진단 시 먼저 spill을 보고, 다음으로 skew를 보라고 안내합니다. Source
이미지: Databricks Spark UI guide Source
Spark 튜닝 문서는 실행 메모리(joins/sorts/shuffles)와 저장 메모리(cache)가 통합된 영역(M) 을 공유하고, 실행이 필요하면 저장을 일부 밀어낼 수 있다고 설명합니다. 또한 spark.memory.fraction, spark.memory.storageFraction의 의미를 공식적으로 정리합니다. Source
spark.memory.fraction(기본 0.6): (heap-300MiB) 중에서 Execution+Storage가 쓰는 풀(M) 비율 Sourcespark.memory.storageFraction(기본 0.5): M 중에서 캐시가 “최소한으로 보호받는” 구간(R) 비율 Source
이미지: Spark 메모리 관리 해설(다이어그램) Source
Databricks KB는 JVM이 커질수록 GC 문제가 나타날 수 있고, 이를 완화하기 위해 일부 클러스터 타입에서 off-heap 모드를 사용한다고 설명합니다. 또한 spark.memory.offHeap.enabled, spark.memory.offHeap.size로 제어된다고 안내합니다. Source
이미지: Databricks KB Source
OutOfMemoryError: Java heap space (Executor 힙 OOM)운영 관점에서 가장 흔한 패턴은 “특정 stage의 특정 task working set이 과대”입니다. Spark 튜닝 문서는 reduce 태스크(예: groupByKey)에서 작업 셋이 너무 커서 OOM이 날 수 있고, 병렬도(파티션 수) 증가로 태스크당 입력을 줄이는 것이 단순한 해결책이라고 설명합니다. Source
(참고용 오류 이미지 예시)
이미지: 사례 스크린샷 포함 페이지 Source
GC overhead limit exceeded (GC 폭주)Spark 튜닝 문서는 GC 비용이 객체 수에 비례하고, 직렬화 캐시(파티션당 byte array 1개) 가 객체 수를 줄여 GC 문제 완화에 도움이 된다고 설명합니다. Source
*_SER) 검토ExecutorLostFailure ... heartbeat timed out (브로드캐스트+GC로 executor가 멈춤)Databricks KB는 큰 테이블을 브로드캐스트하면 모든 executor로 복제되며, executor 메모리가 부족하면 과도한 GC/OOM → heartbeat timeout으로 이어질 수 있다고 설명합니다. Source
spark.sql.autoBroadcastJoinThreshold 또는 spark.databricks.adaptive.autoBroadcastJoinThreshold를 “클러스터에 맞게” 낮추거나 제거(AQE 활용) SourceDatabricks Spark UI 가이드는 spill을 “메모리 부족 시 디스크로 내리는 현상이며 비용이 크다”고 설명합니다. Source
Databricks 가이드는 skew를 “일부 task만 오래 걸려 전체 시간이 늘고 클러스터 활용이 나빠지는 현상”으로 설명하며, Stage Summary Metrics에서 Max가 75p 대비 과도하게 크면 skew를 의심하라고 안내합니다. Source
이미지: Databricks Spark UI guide Source
Databricks SQL CACHE TABLE은 storageLevel을 지정할 수 있고, 지정하지 않으면 기본이 MEMORY_AND_DISK라고 문서에 명시되어 있습니다. Source
Databricks 문서는 Disk cache가 원격 Parquet(Delta 포함) 파일을 워커 로컬 스토리지에 복사해 읽기를 가속하고, LRU 방식으로 자동 eviction되며 파일 변경을 감지해 자동 무효화된다고 설명합니다. Source
Databricks SQL CACHE TABLE 문서 기준, 유효한 storage level 목록(MEMORY_ONLY, MEMORY_AND_DISK, DISK_ONLY, OFF_HEAP 등)이 제공됩니다. Source
MEMORY_AND_DISK로 “살아남는 캐시”를 선호(메모리 부족 시 재계산 폭탄 방지)1) Stage 페이지 상단: spill이 있는가? Source
2) Summary Metrics: skew 패턴인가(Max가 튀는가)? Source
3) spill/skew가 없는데 느리면: Stage → Associated Job으로 역추적해 상위 잡에서 병목 찾기(가이드에 UI 흐름이 나옴) Source
이미지: Databricks Spark UI guide Source
CACHE TABLE은 기본 storage level이 MEMORY_AND_DISK이며, storageLevel 선택은 운영 표준을 따릅니다. Sourcespark.memory.fraction, spark.memory.storageFraction은 통합 메모리 정책의 핵심이므로, 변경 시 “왜 바꾸는지(Spill vs Cache vs GC)”를 근거로 남깁니다. Source아래 3가지만 답 주시면, 위 런북을 귀사 표준 운영 문서 형태(“증상별 Runbook + 설정 표준 + 온콜 체크리스트”)로 더 구체화해드릴게요.
1) 사용 클라우드: AWS / Azure / GCP?
2) 주된 워크로드: 배치 ETL / 스트리밍 / SQL 웨어하우스?
3) 최근 가장 많이 나는 에러 메시지 1개(로그 한 줄 그대로)
(추가 이미지가 더 필요하면, 이미지 생성 도구를 써서 “우리 팀 전용 다이어그램”도 만들 수 있는데, 그건 크레딧/시간이 더 드는 작업이라 원하실 때만 진행하겠습니다. 생성 시 기본 모델은 nano-banana-2를 사용합니다.)