Repartition을 하는 이유
- 전체적으로 파티션 수를 늘려 병렬성 증가
- 매우 큰 파티션이나 Skew 파티션의 크기를 조절하려고
- 파티션을 분석 패턴에 맞게 재분배 (Write once, read many)
- 어떤 DataFrame을 특정 컬럼 기준으로 그룹핑을 하거나 필터링을 자주 하는 경우 (미리 그 컬럼 기준으로 지정해두었다면 그게 Bucketing)
Coalesce가 필요한 경우
- 파티션의 수를 줄이는 용도 (늘리지 않음)
- 셔플링이 발생하지 않고 로컬 파티션들을 머지함 (따라서 Skew 파티션을 만들어낼 수 있음)
- Column이 사용되며 균등한 파티션 크기를 보장할 수 없음
Spark AQE (Adaptive Query Execution)
- Dynamic query optimization that happens in the middle of query execution based on runtime statistics
- Key points: 동적, 실시간 통계정보, 쿼리 중간에 바꿔준다
Dynamically coalescing shuffle partitions
- 왜 필요한가? (적당한 파티션의 크기와 수는 성능에 지대한 영향을 미침)
- 너무 많은 수의 작은 파티션
- 스케줄러 오버헤드
- 태스크 준비 오버헤드
- 비효율적인 I/O (파일시스템/네트워크)
- 적은 수 큰 파티션
- GC 악몽 (OOM=Out Of Memory)
- Disk Spill
spark.sql.shuffle.partitions
라는 하나의 변수로는 불충분