[Spark] 파티션, 셔플링에 대해서

Woong·2021년 12월 20일
0

Apache Spark

목록 보기
5/22

파티션

  • 데이터를 여러 클러스터 노드로 분할하는 매커니즘
  • 파티션 수는 클러스터의 코어 개수보다 서너배 더 많은 파티션을 사용하는 것이 좋음
    • 너무 적으면 클러스터를 충분히 활용할 수 없고, 메모리 문제 발생 가능.
    • 어느정도는 좀 많아도 무방하나, 너무 많이 늘리면 태스크 관리 작업에 병목 현상이 발생함

셔플링

  • 파티션간 물리적인 데이터 이동

    • 변환 함수의 경우 각 파티션 별로 값을 (부분적으로) 병합할 수 있으나
    • 병합 함수는 여러 파티션의 값을 최종 병합하므로, 셔플링이 수행된다.
    • 중간 파일을 기록, 읽으면서 오버헤드 발생 + 네트워크로 셔플링할 데이터 전송하므로 셔플링 횟수는 최대한 줄여야함
      • 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)

정렬 기반 셔플링/해시 기반 셔플링

(생략)

RDD 파티션 변경 관련 연산자

(생략)

0개의 댓글