【问题标题】:reduce() vs. fold() in Apache SparkApache Spark 中的 reduce() 与 fold()
【发布时间】:2016-07-03 14:02:52
【问题描述】:

reducefold 在技术实现方面有什么区别?

我知道它们的签名不同,因为 fold 接受添加到每个分区输出的附加参数(即初始值)。

  • 有人能介绍一下这两个操作的用例吗?
  • 在哪种情况下考虑 0 用于 fold,哪个会更好?

提前致谢。

【问题讨论】:

  • 我认为这不是spark依赖的,儿子会更好地阅读其他资源或问题stackoverflow.com/questions/25158780/…
  • @anquegi,reduce 可以并行化的差异(在您链接到的答案中进行了解释)确实对 Spark 产生了重大影响。它与 Hadoop 无关,.. 确实是那个问题的重复
  • @TheArchetypalPaul fold(不是 foldLeft / foldRight)也可以(并且是)并行化。
  • 查看源代码,它们基本上会同时运行。 fold 在每个分区的迭代器上调用 fold,然后合并结果,reduce 在每个分区的迭代器上调用 reduceLeft 然后合并结果。不同之处在于fold 不需要担心空分区或集合,因为那样它只会使用零值。性能差异可能甚至无法衡量。
  • @zero323,没问题,这是一个很好的答案,无论如何我们都不需要代表:)

标签: scala apache-spark rdd reduce fold


【解决方案1】:

在性能方面没有实际区别:

  • RDD.fold 操作在分区 Iterators 上使用 fold,这是使用 foldLeft 实现的。
  • RDD.reduce 在分区Iterators 上使用reduceLeft

这两种方法都使用foldLeft implemented like this 的简单循环按顺序保持可变累加器和进程分区:

foreach (x => result = op(result, x))

reduceLeft like this:

for (x <- self) {
  if (first) {
    ...
  }
  else acc = op(acc, x)
}

Spark 中这些方法之间的实际区别仅与它们在空集合上的行为和使用可变缓冲区的能力有关(可以说它与性能有关)。你会在Why is the fold action necessary in Spark?找到一些讨论

而且整体处理模型没有区别:

  • 使用单个线程按顺序处理每个分区。
  • 使用多个执行器/执行器线程并行处理分区。
  • 使用驱动程序上的单个线程按顺序执行最终合并。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2017-03-03
    • 2019-10-16
    • 1970-01-01
    相关资源
    最近更新 更多