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

问题描述 投票:0回答:1

我有两对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方法的函数。

scala apache-spark rdd partitioning
1个回答
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)底层分区技术是Hash partitioner。如果我们假设数据最初位于n个分区中,则groupByKey操作将遵循哈希机制。

partition = key.hashCode() % numPartitions

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.