[英]treeReduce vs reduceByKey in Spark
我稍微看了一下以下帖子: 在Spark中了解TreeReduce
我仍然試圖確切地了解何時使用treeReduce與reduceByKey。 我認為我們可以使用一個通用的例子,例如字數統計,以幫助我進一步了解正在發生的事情。
編輯 :所以玩火花殼,我想我從根本上不了解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上可用,而treeReduce
是對任何RDD的reduce
操作的概括。 reduceByKey
用於實現treeReduce
但它們在任何其他意義上都不相關。
reduceByKey
每個鍵執行歸約操作,從而產生RDD; 從RDD的角度來看,它不是“動作”,而是返回ShuffleRDD的轉換。 這相當於groupByKey
后跟一個map
,做關鍵明智的減少(檢查這個為什么使用groupByKey
是無效的)。
另一方面, treeAggregate
是由AllReduce
啟發而來的reduce
函數的AllReduce
。 從火花的意義上講,這是一個“動作”,將結果返回到主節點上。 正如解釋張貼在你的問題的鏈接,進行局部減少手術后reduce
主服務器上的計算,這是非常繁重的執行休息(特別是在機器學習時,減少了大量的載體或矩陣函數的結果)。 取而代之的是, treeReduce
使用reduceByKey
並行執行reduceByKey
(這是通過動態創建鍵-值對RDD來完成的,其中鍵由樹的深度確定;請在此處檢查實現)。
因此,要回答您的前兩個問題,您必須使用reduceByKey
進行字數統計,因為您有興趣獲取每個字數統計,而treeReduce
在這里不合適。 其他兩個問題與此主題無關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.