天天看點

通過spark.default.parallelism談Spark并行度

本篇文章首先通過大家熟知的一個參數spark.default.parallelism為引,聊一聊Spark并行度都由哪些因素決定?

通過spark.default.parallelism談Spark并行度

上圖是spark官網關于spark.default.parallelism參數說明:

1、對于reduceByKey和join這些分布式shuffle算子操作,取決于它的父RDD中分區數的最大值

2、對于沒有父RDD的的算子,比如parallelize,依賴于叢集管理器:

1)本地模式:取決于本地機器的核數
2)如果叢集管理器是Mesos,則為8
3)其他的:對比所有executor上總核數與2比較,哪個大是哪個
           

當然上面這些都是預設值,如果我們自己設定了分區數,情況就會有所變化,直接看源碼【檢視org.apache.spark.Partitioner源碼defaultPartitioner方法】

通過spark.default.parallelism談Spark并行度

你會發現,如果你使用reducebykey、groupByKey等這些帶shuffle的算子,建議不要通過上述方法讓程式内部去推測。完全可以通過傳入一個确定的分區數或者自己實作一個分區器來做處理。當然這個确定的分區數也不是貿貿然設定的,需要結合你的業務場景根據實際情況來确定多少合适。比如shuffle時流經的資料量,這個就要結合分區數和shuffle總資料量來做适當調整,處理不好的結果極有可能導緻資料傾斜等問題...

筆者再次建議,學習Spark一定要多看Spark官網

http://spark.apache.org/

,并且多看源碼

繼續閱讀