apache-spark - 출력 - 아파치 스파크 스칼라



Apache Spark에서 RDD.union이 왜 파티셔를 보존하지 않는가? (1)

Spark의 파티셔너는 "광범위한"작업에 큰 성능 영향을 미치므로 모든 사람이 잘 알고 있으므로 일반적으로 작업에서 사용자 지정됩니다. 나는 다음 코드를 실험하고 있었다.

val rdd1 =
  sc.parallelize(1 to 50).keyBy(_ % 10)
    .partitionBy(new HashPartitioner(10))
val rdd2 =
  sc.parallelize(200 to 230).keyBy(_ % 13)

val cogrouped = rdd1.cogroup(rdd2)
println("cogrouped: " + cogrouped.partitioner)

val unioned = rdd1.union(rdd2)
println("union: " + unioned.partitioner)

기본적으로 cogroup() 은 커스터마이징 된 파 티셔 터를 사용하여 항상 RDD를 생성하지만 union() 은 그렇지 않은 경우 항상 기본으로 돌아갑니다. 이는 PairRDD가 첫 번째 요소를 파티션 키로 사용해야한다고 일반적으로 가정하기 때문에 직관적이지 않습니다. 스파크가 2 개의 PairRDD를 병합하여 동일한 파티션 키를 사용하도록 강제하는 방법이 있습니까?


union 은 데이터를 움직이지 않기 때문에 매우 효율적인 작업입니다. rdd1 에 10 개의 파티션이 있고 rdd2 에 20 개의 파티션이 rdd1.union(rdd2) 에는 30 개의 파티션이 있습니다. 두 개의 RDD 파티션이 서로 뒤에 놓입니다. 이것은 단순한 부기 변경 일 뿐이며 혼란이 없습니다.

그러나 그것은 반드시 분할자를 버립니다. 주어진 수의 파티션에 대해 분할자가 구성됩니다. 결과 RDD에는 rdd1rdd2 와 다른 여러 파티션이 있습니다.

노조를 가져간 후 repartitionrepartition 실행하여 데이터를 섞어서 키로 구성 할 수 있습니다.

위의 예외가 하나 있습니다. rdd1rdd2 가 같은 파티션 수 (같은 수의 파티션 수)를 갖는 경우, union 은 다르게 동작합니다. 두 개의 RDD의 파티션을 쌍으로 결합하여 입력마다 동일한 수의 파티션을 제공합니다. 여기에는 데이터를 이동하는 작업 (파티션이 동일 위치에 있지 않은 경우)이 포함되지만 셔플이 포함되지는 않습니다. 이 경우 분할자는 그대로 유지됩니다. (이 코드는 PartitionerAwareUnionRDD.scala 있습니다.)





hadoop-partitioning