더북(TheBook)

꺾인 화살표는 RDD 계보 사슬을 이루는 RDD 의존 관계를 의미한다. 예를 들어 finalrdd (MapPartitionsRDD)는 reduced(ShuffleRDD)에 의존하고, reducedpairs(MapPartitionsRDD)에 의존하며, pairslistrdd(ParallelCollectionRDD)에 의존한다.

그림 4-4에서 옅은 직선은 프로그램 실행 중 발생하는 데이터 흐름을 의미한다. 그림을 살펴보면 두 번의 map 변환 연산에서는 각 파티션의 데이터를 다른 파티션과 교환할 필요가 없으며, 데이터 흐름이 파티션 내로 한정된 것을 알 수 있다. 따라서 두 map 연산자는 좁은 (1-대-1) 의존 관계를 형성한다. 반면 reduceByKey 연산은 셔플링을 수행하며 넓은(또는 셔플) 의존 관계를 형성한다(이는 4.2.2절에서 설명했듯이 map 변환 연산자가 Partitioner를 제거하기 때문이다). 다시 말해 reduceByKey 연산에서는 각 키-값 쌍을 적절한 파티션으로 옮겨야 하므로, pairs RDD의 파티션들과 reduced RDD의 파티션들 사이에서 데이터가 교환된다.

스파크 셸에서도 toDebugString 메서드를 호출해 그림 4-4와 유사한 DAG 정보를 텍스트 형식으로 출력할 수 있다. 예를 들어 finalrddtoDebugString을 호출한 결과는 다음과 같다.

scala> println(finalrdd.toDebugString)
(6) MapPartitionsRDD[4] at mapPartitions at <console>:20 []
| ShuffledRDD[3] at reduceByKey at <console>:18 []
+-(5) MapPartitionsRDD[2] at map at <console>:16 []
   | ParallelCollectionRDD[1] at parallelize at <console>:14 []

 

출력된 결과를 살펴보면, RDD 계보 사슬이 그림 4-4 순서와는 반대로 나열된 것을 알 수 있다. 여기서는 DAG의 첫 번째 RDD(ParallelCollectionRDD)를 맨 마지막에 출력했으므로 의존 관계 방향성도 아래에서 위로 향한다. toDebugString 출력 결과를 잘 활용하면 스파크 프로그램의 셔플링 횟수를 최소화할 수 있다. 즉, 계보 사슬에서 ShuffledRDD가 출력된 지점을 곧 셔플링을 수행하는 시점으로 간주할 수 있다(물론 셔플링을 수행하려면 RDD 연산을 실제로 실행해야 한다). 괄호 안 숫자(5와 6)는 해당 RDD의 파티션 개수를 의미한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.