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 上可用,而treeReduce
是reduce
对任何 RDD 操作的泛化。 reduceByKey
用于实现treeReduce
,但它们在任何其他意义上都没有关系。
reduceByKey
对每个键执行归约,产生一个 RDD;它不是 RDD 意义上的“动作”,而是返回 ShuffleRDD 的转换。这相当于groupByKey
后跟一个map
,它执行按键缩减(检查this 为什么使用groupByKey
效率低下)。
另一方面,treeAggregate
是reduce
函数的泛化,灵感来自AllReduce
。这是火花意义上的“动作”,在主节点上返回结果。正如您问题中发布的链接所解释的那样,在执行本地归约操作后,reduce
在主节点上执行其余计算,这可能非常繁琐(尤其是在机器学习中,当归约函数导致大向量或矩阵时) .相反,treeReduce
使用 reduceByKey
并行执行缩减(这是通过动态创建键值对 RDD 来完成的,键由树的深度确定;检查实现 here)。
因此,要回答您的前两个问题,您必须使用 reduceByKey
来计算字数,因为您有兴趣获得每个字数,而 treeReduce
在这里不合适。其他两个问题与本主题无关。
【讨论】:
以上是关于Spark中的treeReduce与reduceByKey的主要内容,如果未能解决你的问题,请参考以下文章
spark-sql 与 spark-shell REPL 中的 Spark SQL 性能差异
Hadoop中的Shuffle 与 Spark中的Shuffle得区别与联系