-
파티션간 물리적인 데이터 이동
- 변환 함수의 경우 각 파티션 별로 값을 (부분적으로) 병합할 수 있으나
- 병합 함수는 여러 파티션의 값을 최종 병합하므로, 셔플링이 수행된다.
- 중간 파일을 기록, 읽으면서 오버헤드 발생 + 네트워크로 셔플링할 데이터 전송하므로 셔플링 횟수는 최대한 줄여야함
- partitioner를 명시적으로 변경하는 경우
- Partitioner를 제거하는 경우
- ※ map, flatmap은 RDD의 partitioner를 제거하는 연산임
(정확히는 그 뒤에 특정 변환 연산자를 사용할 경우)
-
external shuffling service
- executor 가 다른 executor의 파일을 읽어야하는데, 다른 executor에 장애 발생시 거기서 처리한 데이터 못읽음 -> 데이터 흐름 중단
- -> external shuffling service 활성화시 executor가 중간 셔플 파일을 읽을 수 있는 단일 지점을 제공 -> 셔플링의 데이터 교환 과정 최적화
- spark.shuffle.service.enabled 를 true 설정시 활성화됨
- -> 각 worker 노드별로 외부 셔플링 서버를 시작함.
-
spark.shffle.compress : 중간 파일의 압축 여부 지정 (기본 true)
-
spark.shuffle.spill.batchSize : 데이터를 디스크로 내보낼 때 일괄 직렬화/역직렬화할 객체 개수 지정 (기본 1만개)
-
spark.shuffle.service.port : 외부 셔플링 서비스 활성화할 경우, 서비스 서버가 사용할 포트 지정 (기본 7337)