2015-11-04 22 views
0

從Spark的粗粒度特性中,當運行包含按鍵的Join或Reduce等Spark工作時,最好將spark.default.parallelism更改爲大數字,以便大量線程可以同時在單個分區上工作?Spark YARN> spark.default.parallelism>從粗粒度的角度來看,大於或小於

我的理解應該沒問題吧?但缺點是這可能會使網絡I/O流量繁忙。默認值是所有可用內核的數量

任何人都可以對此提出一些意見?在此先感謝

回答

3

,使大量的線程可以對單個分區工作同時

分區是Spark併發的最小單位。這意味着每個分區只有一個線程。您當然可以在mapPartitions內使用並行處理,但它不是標準Spark邏輯的一部分。

更高的並行性意味着當未指定分區數時,更多分區。通常這是一個理想的結果,但它帶有一個價格。這意味着不斷增加的簿記成本,效率較低的聚合以及一般而言較少的數據可以在沒有序列化/反序列化和網絡流量的情況下在本地處理。當分區數量與數據量和可用內核數量相比非常高時(見Spark iteration time increasing exponentially when using join),當分區數量增加時,它可能會變成嚴重問題。

當是有意義的增加並行:

  • 你有大量的數據和大量的空閒資源(建議分區的數量是多少可用核的兩倍)。
  • 您想要減少處理單個分區所需的內存量。
  • 您執行計算密集型任務。

當它沒有有意義的增加並行:

  • 並行>>可用內核的數量。
  • 與數據量相比,並行性高,並且您想要在此時處理多個記錄(groupBy,reduce,agg)。

一般而言,我認爲spark.default.parallelism不是一個非常有用的工具,它更有意義調整並行性的個案基礎。如果並行性過高,則在數據加載和簡單轉換以及降低性能/次優資源使用情況下會導致空分區。如果它太低,則在執行可能需要大量分區(連接,聯合)的轉換時可能會導致問題。

相關問題