我有两个RDD[K,V],其中K=LongV=Object。让我们调用rdd1rdd2。我有一个通用的自定义分区程序。我试图通过避免或最小化数据移动找到一种采用unionjoin的方法。

val kafkaRdd1 = /* from kafka sources */
val kafkaRdd2 = /* from kafka sources */

val rdd1 = kafkaRdd1.partitionBy(new MyCustomPartitioner(24))
val rdd2 = kafkaRdd2.partitionBy(new MyCustomPartitioner(24))

val rdd3 = rdd1.union(rdd2) // Without shuffle
val rdd3 = rdd1.leftOuterjoin(rdd2) // Without shuffle

是否可以安全地假设(或强制执行)同一nth-Partition节点上的rdd1rdd2slave

最佳答案

无法在Spark中强制实现*托管,但是您使用的方法将最大程度地减少数据移动。创建PartitionerAwareUnionRDD时,将分析输入RDDs以根据每个位置的记录数选择最佳输出位置。有关详细信息,请参见 getPreferredLocations 方法。

*根据High Performance Spark

10-01 09:12