大數據

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

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

W1.jpg

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

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

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

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

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

W2.jpg

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

筆者再次建議,學習Spark一定要多看Spark官網http://spark.apache.org/,並且多看源碼

Leave a Reply

Your email address will not be published. Required fields are marked *