treeReduce vs reduceByKey in Spark



我看到了下面的帖子:理解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 <console>:25
scala> val tree = input.treeReduce(_+_, 2)
<console>:25: error: type mismatch;
 found   : (String, Int)
 required: String
       val tree = input.treeReduce(_+_, 2)

两者之间有一个根本区别——reduceByKey仅在键值对RDD上可用,而treeReducereduce运算在任何RDD上的推广。CCD_ 4用于实现CCD_。

reduceByKey对每个密钥执行归约,得到RDD;它不是RDD意义上的"操作",而是返回ShuffleRDD的转换。这相当于groupByKey后面跟着进行密钥缩减的map(请检查为什么使用groupByKey效率低下)。

另一方面,treeAggregatereduce函数的推广,其灵感来源于AllReduce。这是火花意义上的"操作",返回主节点上的结果。正如你的问题中发布的链接所解释的那样,在执行局部reduce操作后,reduce在master上执行其余的计算,这可能会非常繁重(尤其是在机器学习中,reduce函数导致大向量或矩阵时)。相反,treeReduce使用reduceByKey并行执行缩减(这是通过动态创建一个键值对RDD来完成的,密钥由树的深度决定;请在此处检查实现)。

因此,要回答前两个问题,您必须使用reduceByKey进行单词计数,因为您对每个单词的计数感兴趣,而treeReduce在这里不合适。另外两个问题与本主题无关。

最新更新