mapPartitions Vs foreach plus accumulator方法

时间:2015-05-28 13:41:58

标签: java scala foreach apache-spark

在某些情况下,我可以使用mapPartitions或foreach方法获得相同的结果。

例如,在典型的MapReduce方法中,在mapPartitions转换元组(key,value)的集合中的原始RDD之后,会立即执行reduceByKey。我认为通过使用例如累加器数组可以实现相同的结果,其中每个索引处的执行器总和一个值,索引本身可以是一个键。

由于reduceByKey将在磁盘上执行shuffle,我认为当可能时,即使foreach具有向累加器求值的副作用,foreach方法也应该更好。

我正在提出此请求,看看我的推理是否正确。我希望我很清楚。

1 个答案:

答案 0 :(得分:0)

不要使用聚合器。它们不太可靠。 (例如,如果启用了推测执行,它们可以重复计算。)

但你所描述的方法有它的优点。

  • reduceByKey有一个随机播放。好处是它可以处理比单个机器上更多的键。
  • 使用foreach +聚合器方法可以避免混乱。但是现在你无法处理比一台机器上的键更多的键。此外,您必须提前知道密钥,以便您可以创建聚合器。代码也变得一团糟。

如果您的密钥数量很少,那么reduceByKeyLocally方法就是您所需要的。它与您的聚合技巧基本相同,只是它没有使用聚合器,您不必提前知道密钥,而且它是{{{{ 1}}。

reduceByKeyLocally为每个分区创建一个hashmap,将哈希映射发送给驱动程序并将它们合并到那里。