Spark中的treeReduce与reduceByKey

Posted

技术标签:

【中文标题】Spark中的treeReduce与reduceByKey【英文标题】:treeReduce vs reduceByKey in Spark 【发布时间】:2015-12-03 23:43:56 【问题描述】:

我看到了以下帖子:Understanding TreeReduce in Spark

我仍在尝试准确了解何时使用 treeReduce 和 reduceByKey。我认为我们可以使用一个通用示例,例如字数统计来帮助我进一步了解正在发生的事情。

在字数统计中使用 reduceByKey 总是有意义吗? 或者当 treeReduce 更有意义时,是否存在特定大小的数据? 当 treeReduce 是更好的选择时,是否有特殊情况或经验法则? 这也可以在上面基于 reduceByKey 得到回答,但使用 reduceByKeyLocally 和 treeReduce 会发生任何变化 如何正确确定深度?

编辑:所以在 spark-shell 中玩,我想我根本不了解 treeReduce 的概念,但希望一个例子和这些问题有所帮助。

res2: Array[(String, Int)] = Array((D,1), (18964,1), (D,1), (1,1), ("",1), ("",1), ("",1), ("",1), ("",1), (1,1))

scala> val reduce = input.reduceByKey(_+_)
reduce: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[11] at reduceByKey at <console>:25

scala> val tree = input.treeReduce(_+_, 2)
<console>:25: error: type mismatch;
 found   : (String, Int)
 required: String
       val tree = input.treeReduce(_+_, 2)

【问题讨论】:

【参考方案1】:

两者之间有一个根本区别——reduceByKey 仅在键值对 RDD 上可用,而treeReducereduce 对任何 RDD 操作的泛化。 reduceByKey 用于实现treeReduce,但它们在任何其他意义上都没有关系。

reduceByKey 对每个键执行归约,产生一个 RDD;它不是 RDD 意义上的“动作”,而是返回 ShuffleRDD 的转换。这相当于groupByKey 后跟一个map,它执行按键缩减(检查this 为什么使用groupByKey 效率低下)。

另一方面,treeAggregatereduce 函数的泛化,灵感来自AllReduce。这是火花意义上的“动作”,在主节点上返回结果。正如您问题中发布的链接所解释的那样,在执行本地归约操作后,reduce 在主节点上执行其余计算,这可能非常繁琐(尤其是在机器学习中,当归约函数导致大向量或矩阵时) .相反,treeReduce 使用 reduceByKey 并行执行缩减(这是通过动态创建键值对 RDD 来完成的,键由树的深度确定;检查实现 here)。

因此,要回答您的前两个问题,您必须使用 reduceByKey 来计算字数,因为您有兴趣获得每个字数,而 treeReduce 在这里不合适。其他两个问题与本主题无关。

【讨论】:

以上是关于Spark中的treeReduce与reduceByKey的主要内容,如果未能解决你的问题,请参考以下文章

spark-sql 与 spark-shell REPL 中的 Spark SQL 性能差异

Python 如何与 Spark 中的 JVM 交互

Hadoop中的Shuffle 与 Spark中的Shuffle得区别与联系

是否可以将 Spark 中的 data.table 与 Spark Dataframes 一起使用?

生产环境中的 Hive 与 Spark

Spark中的DataFilter与PushedFilter?