Spark中成组的PairRDD中的最佳分区数

时间:2018-08-20 15:44:02

标签: scala apache-spark rdd partitioning

我有两对RDD,它们的结构为RDD [String,Int],分别称为rdd1和rdd2。

每个RDD均按其键分组,我想对其值执行一个函数(因此,我将使用mapValues方法)。 方法“ GroupByKey”是否为每个键创建一个新分区,还是我需要使用“ partitionBy”手动指定此分区?

我了解,如果不执行更改键的操作,则RDD的分区不会更改,因此,如果我在每个RDD上执行mapValues操作,或者在前两个RDD之间执行联接操作,生成的RDD的分区不会更改。 是真的吗?

这里有一个代码示例。请注意,未定义“功能”,因为此处不重要。

val lvl1rdd=rdd1.groupByKey()
val lvl2rdd=rdd2.groupByKey()
val lvl1_lvl2=lvl1rdd.join(lvl2rdd)
val finalrdd=lvl1_lvl2.mapValues(value => function(value))

如果我加入了以前的RDD,并且对生成的RDD的值(mapValues)执行了一个函数,则所有工作都在单个工作程序中完成,而不是在群集的不同工作程序节点上分配不同的任务。我的意思是,期望的行为应该是在集群允许的许多节点中并行执行作为参数传递给mapValues方法的函数。

1 个答案:

答案 0 :(得分:1)

1)避免使用 groupByKey 操作,因为它们会成为网络I / O和执行性能的瓶颈。 在这种情况下,最好使用 reduceByKey 操作,因为数据混洗比groupByKey相对较少,并且如果数据集较大,我们可以更好地看到差异。

val lvl1rdd = rdd1.reduceByKey(x => function(x)) 
val lvl1rdd = rdd2.reduceByKey(x => function(x))
//perform the Join Operation on these resultant RDD's

将函数分别应用于RDD并将其连接起来要比加入RDD并使用groupByKey()应用函数要好得多

这还将确保任务在不同的执行者之间分配并并行执行

Refer this link

2)。基本的分区技术是哈希分区器。如果我们假设数据最初位于 n 个分区中,则 groupByKey 操作将遵循哈希机制。

partition = key.hashCode() % numPartitions

这将创建固定数量的分区,该数量可以大于使用 groupByKey 操作时的初始数量。我们还可以自定义要创建的分区。例如

val result_rdd = rdd1.partitionBy(new HashPartitioner(2))

这将创建2个分区,这样我们可以设置分区数。 要确定最佳分区数量,请参考答案https://stackoverflow.com/a/40866286/7449292