9. OOM 디버깅
9.1 OOM 유형별 진단
| OOM 유형 | 에러 메시지 | 원인 | 해결 |
|---|---|---|---|
| Driver OOM | java.lang.OutOfMemoryError: Java heap space (Driver) | collect(), toPandas(), 큰 Broadcast | Driver 메모리 증가 또는 collect 제거 |
| Executor OOM | java.lang.OutOfMemoryError: Java heap space (Executor) | 데이터 편향, 큰 파티션 | 파티션 수 증가, 메모리 증가 |
| Container OOM | Container killed by YARN for exceeding memory limits | Off-heap 메모리 초과 | spark.memory.offHeap.size 증가 |
| GPU OOM | CUDA out of memory | 배치 사이즈 과대, 모델 과대 | 배치 사이즈 축소, Mixed Precision |
9.2 OOM 해결 체크리스트
10. GC 튜닝
10.1 GC 문제 진단
| GC 설정 | 기본값 | 권장값 | 효과 |
|---|---|---|---|
-XX:+UseG1GC | G1GC (기본) | G1GC 유지 | Spark에 최적화 |
-XX:G1HeapRegionSize | 자동 | 16m | 대용량 힙에서 효율적 |
-XX:InitiatingHeapOccupancyPercent | 45 | 35 | GC 일찍 시작하여 긴 Pause 방지 |
-Xmx | 클러스터 설정 | 인스턴스 메모리의 60~70% | 나머지는 Off-heap/OS 용 |
10.2 GC 부담 줄이는 코딩 패턴
11. 메모리 프로파일링
11.1 Spark 메모리 구조
11.2 메모리 사용 진단
| 메모리 설정 | 조정 방향 | 시나리오 |
|---|---|---|
spark.executor.memory | ↑ | Spill 발생, OOM |
spark.memory.fraction | ↑ (0.6→0.7) | 캐시 많이 사용, 큰 집계 |
spark.memory.offHeap.size | ↑ | Photon 사용, Container OOM |
spark.sql.shuffle.partitions | ↑ | 파티션당 메모리 초과 |
spark.driver.memory | ↑ | Driver OOM, 큰 Broadcast |
참고 메모리 최적화 우선순위: 1) 불필요한 컬럼 제거 (SELECT * 금지) → 2) 파티션 수 조정 → 3) Broadcast 임계값 조정 → 4) 인스턴스 메모리 증가. 인스턴스 업그레이드는 마지막 수단으로, 코드 최적화를 먼저 시도하세요.
12. 성능 진단 체크리스트
단계별로 성능 문제를 진단하고 해결하는 가이드입니다.Step 1: 쿼리가 느린가?
Step 2: 스캔 최적화
Step 3: 조인 최적화
Step 4: 집계/셔플 최적화
Step 5: 리소스 최적화
빠른 참조: 증상별 해결 매트릭스
| 증상 | 1순위 확인 | 2순위 확인 | 3순위 확인 |
|---|---|---|---|
| 쿼리 시작이 느림 | Warehouse Auto Stop 설정 | Instance Pool 사용 | Serverless 전환 |
| 스캔이 느림 | Liquid Clustering | 통계 수집 | 파일 크기 최적화 |
| 조인이 느림 | Broadcast 가능 여부 | Skew 확인 | 클러스터 사이즈 |
| 집계가 느림 | Photon 활성화 | MV 사전 계산 | Partition 수 조정 |
| Spill 발생 | 메모리 확대 | Partition 수 증가 | 쿼리 분리 |
| 스트리밍 지연 | 트리거 간격 | Checkpoint 위치 | 파일 수 제한 |
| ML 추론 느림 | 모델 최적화 | GPU 선택 | 배치 크기 조정 |