Spark - 파티셔너(Partitioner)&셔플링(shuffling)

2022. 3. 10. 11:23BigDATA/spark

반응형

파티셔너에 의해 RDD 파티셔닝이 실행된다.
파티셔너는 파티션 인덱스를 RDD 엘리먼트에 할당한다.
동일 파티션에 존재하는 모든 엘리먼트는 동일한 파티션 인덱스를 가질 것이다.
스파크는 HashPartitioner와 RangePartitioner라는 두개의 파티션이 있다.
(사용자 정의 파티셔너도 구현 가능!)

HashPartitioner
Spark의 기본 파티셔너이고, RDD 엘리먼트의 각 키에 대한 해시값을 계산한다.
동일한 해시 코드를 가진 모든 엘리먼트는 다음 코드처럼 동일 파티션을 얻는다.

https://www.oreilly.com/content/what-is-hash-partitioning-in-kudu/

 

hashCode()를 사용해 3으로 설정된 파티션 개수를 기반으로 각 엘리먼트마다 partitionIndex를 얻을 수 있다.

RangePartitioner
RangePartitioner는 RDD를 거의 동일한 범위로 파티셔닝한다.
범위는 모든 파티션의 시작 키와 종료 키를 알고 있어야 하기 때문에 RangePartition을 사용하기 전에 RDD를 먼저 정렬 해야한다.
RangePartitioning은 먼저 RDD를 기반으로 하는 파티션에 대한 합리적인 경계를 필요로 하고 키 K부터 특정 엘리먼트를 올바르게 배포하기 위해 RangePartitioner를 기반으로 RDD를 리파티셔닝해야한다.
(정렬은 Pair-RDD 를 사용: 집계, 정렬, 데이터 조인과 같은 많은 사용 사례에 적합)

아래의 그림에서는 처음 Table에서 Pair RDD, 두번째에서는 Range Partitioned RDD를 수행.

https://www.oreilly.com/content/what-is-hash-partitioning-in-kudu/

 

셔플링
파티셔너가 어떤 파티션을 사용하든 많은 연산이 RDD의 파티션 전체에 걸쳐 data 리파티셔닝(repartitioning)이 발생하게 한다.
새로운 파티션이 샐성 될 수 있거나 파티션이 축소되거나 병할 될 수 있다. 
리파티셔닝에 필요한 모든 데이터 이동을 셔플링(shuffling)이라 한다.
셔플링은 스파크 잡을 작성할 때 이해해야하는 중요한 개념이다.
셔플링은 계산을 동일 익스큐터의 메모리에서 더 이상 진행하지 않고 익스큐터 간에 데이터를 교환하기 때문에
많은 성능 지연을 초래할 수 있다.
좋은 예가 groupByKey 연산을 수행 시 키의 모든 값이 동일한 익스큐터에 수집되도록 익스큐터 간에 많은 데이터가 흘러간다.
셔플링은 스파크 잡의 실행 프로세스를 결정할 뿐 아니라 잡이 스테이지로 분할도는 부분에 영향을 미친다.
(spark는 RDD의 계보를 나타내는 DAG를 가지고 있고 spark는 job 실행을 계획하기 위해 DAG를 사용할 뿐만 아니라 익스큐터에 장애가 발생해도 바로 복구할 수 있다.)

반응형