參考資料:
http://stackoverflow.com/questions/32281417/understadning-treereduce-in-spark
http://stackoverflow.com/questions/34078430/treereduce-vs-reducebykey-in-spark
reduceByKey和treeReduce之間有一個根本區別,reduceByKey它只對key-value pair RDDs可用,而treeReduce可以對任何RDD使用,相當於是reduce操作的泛化。 reduceByKey用於實現treeReduce,但它們在任何其他意義上都不相關。
reduceByKey對每個鍵執行reduce,結果生成RDD; 它不是"action"操作,而是返回ShuffleRDD,是"transformation"。 這等效於groupByKey后面跟着一個map,它執行key-wise reduction(為什么使用groupByKey是低效的)。
另一方面,treeAggregate是reduce函數的泛化,靈感來自AllReduce。 這在Spark中是一個"action",將結果返回到master節點。在執行本地的reduce操作之后,普通的reduce在master上執行剩余的計算,這樣的計算量可能是非常繁重的(特別是在機器學習中,reduce函數結果是大的向量或矩陣時)。 相反,treeReduce使用reduceByKey並行的執行reduction(這是通過在運行時創建key-value pair RDD,其中鍵由樹的深度確定)
treeReduce & reduce return some result to driver
treeReduce does more work on the executors
while reduce bring everything back to the driver.
