在Spark中,当未指定分区程序时,ReduceByKey操作是否在开始聚合之前通过哈希将数据重新分区?

时间:2018-08-13 13:30:56

标签: scala apache-spark rdd data-partitioning

如果我们没有为reduceByKey操作提及任何分区程序,那么它在缩减之前是否在内部执行hashPartitioning?例如,我的测试代码如下:

val rdd = sc.parallelize(Seq((5, 1), (10, 2), (15, 3), (5, 4), (5, 1), (5,3), (5,9), (5,6)), 5)
val newRdd = rdd.reduceByKey((a,b) => (a+b))

在这里,reduceByKey操作是否将具有相同键的所有记录带到同一分区并执行还原(对于上面提到的代码,当未提到分区器时)?由于我的用例的数据偏斜(所有键都有相同的键),如果将所有记录都放在一个分区中,可能会导致out of memory错误。因此,记录在所有分区上的均匀分布适合此处的用例。

1 个答案:

答案 0 :(得分:2)

实际上,使用reduceByKey而不是groupByKey的最大优点是spark在合并之前(即在重新分区之前)将合并同一分区上的键。因此,由于使用reduceByKey导致的数据偏斜,极不可能出现内存问题。

有关更多详细信息,您可能想从比较reduceByKeygroupByKey的数据块中读取this post。他们特别会这样说:

  

虽然这两个函数都将产生正确的答案,但reduceByKey示例在大型数据集上的效果要好得多。这是因为Spark知道可以在对数据进行混洗之前将输出与每个分区上的公共密钥结合起来。