簡體   English   中英

Spark中的treeReduce與reduceByKey

[英]treeReduce vs reduceByKey in Spark

我稍微看了一下以下帖子: 在Spark中了解TreeReduce

我仍然試圖確切地了解何時使用treeReduce與reduceByKey。 我認為我們可以使用一個通用的例子,例如字數統計,以幫助我進一步了解正在發生的事情。

  • 在字數統計中使用reduceByKey總是有意義嗎?
  • 或者當treeReduce更有意義時,是否存在特定大小的數據?
  • 當treeReduce是更好的選擇時,是否有特殊情況或經驗法則?
  • 也可以在上面基於reduceByKey來回答,但是用reduceByKeyLocally和treeReduce可以做任何改變
  • 如何適當確定深度?

編輯 :所以玩火花殼,我想我從根本上不了解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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM