如果我们没有为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
错误。因此,记录在所有分区上的均匀分布适合此处的用例。
答案 0 :(得分:2)
实际上,使用reduceByKey
而不是groupByKey
的最大优点是spark在合并之前(即在重新分区之前)将合并同一分区上的键。因此,由于使用reduceByKey
导致的数据偏斜,极不可能出现内存问题。
有关更多详细信息,您可能想从比较reduceByKey
与groupByKey
的数据块中读取this post。他们特别会这样说:
虽然这两个函数都将产生正确的答案,但reduceByKey示例在大型数据集上的效果要好得多。这是因为Spark知道可以在对数据进行混洗之前将输出与每个分区上的公共密钥结合起来。