Spark Shuffle과 Spill 현상 이해하기
AWS Glue workflow 사용 중 3시간 정도 걸리는 Glue Job이 발견되었습니다. Worker의 수를 10개에서 30개로 증가시키니 17분으로 드라마틱하게 단축되어, 이러한 현상이 발생한 원인을 분석해보았습니다.
Spark Shuffle 이해하기
Spark에는 Shuffle Partition이라는 개념이 존재합니다. join
, groupBy
, repartition
등의 연산을 수행할 때 이 Shuffle Partition이 사용되며, 이는 Spark의 성능에 가장 큰 영향을 미치는 요소입니다.
Shuffle Partition 특징
- 기본값으로 200개의 파티션이 설정됩니다.
- 데이터 크기에 비해 파티션 수가 적으면 각 파티션의 부하가 증가합니다.
- 반대로 파티션 수가 너무 많으면 관리 오버헤드가 증가합니다.
Shuffle Spill 현상
Shuffle 작업 중 가장 주의해야 할 현상이 바로 Shuffle Spill입니다. 이는 연산에 필요한 메모리가 부족할 때 발생하며, 다음과 같은 과정으로 진행됩니다:
- 메모리 부족 상황 발생
- 데이터를 직렬화하여 디스크에 임시 저장
- 필요할 때 다시 역직렬화하여 메모리로 로드
- 연산 재개
이러한 Shuffle Spill이 발생하면 다음과 같은 문제가 발생할 수 있습니다:
- Task 지연 및 에러 발생 가능성 증가
- 디스크 I/O로 인한 성능 저하
- 직렬화/역직렬화 과정에서의 추가적인 리소스 소모
성능 개선 방안
Worker 수 증가의 효과
Worker 수를 증가시켰을 때 성능이 크게 향상된 이유는 다음과 같습니다:
- 더 많은 Worker가 동시에 데이터를 처리하여 병렬 처리 능력이 향상됩니다.
- 각 Worker가 처리해야 하는 데이터양이 감소하여 Shuffle Spill 발생 가능성이 줄어듭니다.
최적화를 위한 설정
메모리 관리
spark.executor.memory
: Executor의 메모리 크기 설정spark.executor.memoryOverhead
: 추가 메모리 버퍼 설정
파티션 관리
spark.sql.shuffle.partitions
: Shuffle Partition 수 조정- 파티션 크기를 100MB~200MB 사이로 유지하는 것이 권장됩니다.
AWS Glue의 S3 Shuffle
AWS Glue 3.0부터는 S3 기반 Shuffle 기능을 제공하여 다음과 같은 이점이 있습니다:
- 대규모 Shuffle 작업에서도 안정적인 성능 제공
- Worker 노드의 로컬 디스크 제한 극복
- 작업 실패 시에도 중간 Shuffle 데이터 보존
이러한 최적화 방법들을 적절히 활용하면 Spark 작업의 성능을 크게 향상시킬 수 있습니다. 특히 대용량 데이터를 처리할 때는 Shuffle Spill 현상을 주의 깊게 모니터링하고, 적절한 Worker 수와 메모리 설정을 통해 성능을 최적화하는 것이 중요합니다.
참고 사이트:
다른 게시물 읽기