我稍微看了下面的帖子:了解Spark中的TreeReduce
我仍然试图准确地理解何时使用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:25 scala> val tree = input.treeReduce(_+_, 2) :25: error: type mismatch; found : (String, Int) required: String val tree = input.treeReduce(_+_, 2)
小智.. 6
两者之间存在根本区别 - reduceByKey
仅在键值对RDD上可用,而对任何RDD treeReduce
的reduce
操作概括.reduceByKey
用于实现,treeReduce
但它们在任何其他意义上都没有关联.
reduceByKey
每个密钥执行减少,产生RDD; 它不是RDD意义上的"动作",而是一个返回ShuffleRDD的转换.这相当于groupByKey
后跟一个map
按键减少(检查这个为什么使用groupByKey
效率低).
另一方面,treeAggregate
是一种reduce
功能的概括,受到启发AllReduce
.这是火花意义上的"动作",在主节点上返回结果.正如您在问题中发布的链接所解释的,在执行局部缩减操作之后,reduce
在主控器上执行其余的计算,这可能非常繁琐(尤其是在reduce函数导致大矢量或矩阵时的机器学习中).相反,treeReduce
使用并行执行减少reduceByKey
(这是通过动态创建键值对RDD来完成的,其中键由树的深度确定;请在此处检查实现).
所以,要回答你的前两个问题,你必须使用reduceByKey
字数,因为你有兴趣获得每个字数,treeReduce
这里不合适.其他两个问题与此主题无关.
两者之间存在根本区别 - reduceByKey
仅在键值对RDD上可用,而对任何RDD treeReduce
的reduce
操作概括.reduceByKey
用于实现,treeReduce
但它们在任何其他意义上都没有关联.
reduceByKey
每个密钥执行减少,产生RDD; 它不是RDD意义上的"动作",而是一个返回ShuffleRDD的转换.这相当于groupByKey
后跟一个map
按键减少(检查这个为什么使用groupByKey
效率低).
另一方面,treeAggregate
是一种reduce
功能的概括,受到启发AllReduce
.这是火花意义上的"动作",在主节点上返回结果.正如您在问题中发布的链接所解释的,在执行局部缩减操作之后,reduce
在主控器上执行其余的计算,这可能非常繁琐(尤其是在reduce函数导致大矢量或矩阵时的机器学习中).相反,treeReduce
使用并行执行减少reduceByKey
(这是通过动态创建键值对RDD来完成的,其中键由树的深度确定;请在此处检查实现).
所以,要回答你的前两个问题,你必须使用reduceByKey
字数,因为你有兴趣获得每个字数,treeReduce
这里不合适.其他两个问题与此主题无关.