Spark提交做業job的時候要指定該job可使用的CPU、內存等資源參數,生產環境中,任務資源分配不足會致使該job執行中斷、失敗等問題,因此對Spark的job資源參數分配調優很是重要。html
spark提交做業,yarn-cluster模式示例:併發
./bin/spark-submit\性能
--class com.ww.rdd.wordcount \spa
--master yarn \線程
--deploy-mode cluster \
--executor-memory 4G \
--num-executors 50 \htm
--driver-memory 1G \blog
--conf spark.default.parallelism=1000 \ 隊列
--conf spark.memory.fraction=0.75 \ 進程
--conf spark.memory.storageFraction=0.5 \內存
/home/spark/wordcount.jar \
1000 #入參
num-executors
參數說明:該參數用於設置每一個Spark做業總共要用多少個Executor進程來執行。例如Driver向YARN集羣管理器申請資源時,YARN集羣管理器會盡量按照該配置在集羣的各個worker節點上啓動相應數量的Executor進程。這個參數很是重要,若是不設置的話,Spark默認只啓動少許的Executor進程,意味着該Spark做業並行度不足,若是做業計算多、數據很大,會致使運行速度很是慢甚至資源不足,異常中斷,沒法完成等。
調優建議:num-executors設置太少或太多的Executor進程都很差。設置的太少,沒法充分利用集羣資源;設置的太多的話,大部分隊列可能沒法給予充分的資源。生產環境摸索的經驗是每一個Spark做業的運行通常設置50~100個左右的Executor進程比較合適。
executor-memory
參數說明:該參數用於設置每一個Executor進程的內存。Executor內存的大小,不少時候直接決定了Spark做業的性能,並且跟常見的JVM OOM異常,也有直接的關係。
調優建議:若是內存資源充足的前提下,通常每一個job給每一個Executor進程的內存設置4G~8G較爲合適,供參考。具體的設置還得根據Spark集羣能夠佔用的內存資源總量來定。num-executors * executor-memory,是本Spark做業申請到的內存資源量,這個值是不能超過Spark集羣能夠佔用的內存資源總量的。
executor-cores
參數說明:該參數用於設置每一個Executor進程的CPU cores數量。這個參數決定了每一個Executor進程並行執行task線程的能力。由於每一個CPU core同一時間只能執行一個task線程,所以每一個Executor進程的CPU cores數量越多,越可以快速地並行執行完分配給本身的全部task線程。
調優建議:若是CPU核數資源充足的前提下,通常每一個job給每一個Executor的CPU core數量設置爲2~4個較爲合適,供參考。具體的設置還得根據Spark集羣能夠佔用的CPU core數量資源總量來定。num-executors * executor-cores,是本Spark做業申請到的CPU core數量,這個值是不能超過Spark集羣能夠佔用的CPU core數量資源總量的。
driver-memory
參數說明:該參數用於設置Driver進程的內存。
調優建議:Driver的內存一般來講不設置,或者設置1G左右應該就夠了。惟一須要注意的一點是,若是須要使用collect算子將RDD的數據所有拉取到Driver上進行處理,那麼必須確保Driver的內存足夠大,不然會出現OOM內存溢出的問題。
spark.default.parallelism
參數說明:該參數用於設置每一個stage的默認task數量。這個參數極爲重要,若是不設置可能會直接影響Spark做業性能。
調優建議:若是不設置這個參數,會致使Spark本身根據底層HDFS的block數量來設置task的數量,默認是一個HDFS block對應一個task。一般來講,Spark默認設置的數量是偏少的(好比就幾十個task),若是task數量偏少的話,就會致使你前面設置好的Executor的參數都前功盡棄。試想一下,不管Executor進程有多少個,內存和CPU資源分配有多充足,可是task只有1個或者10個,那麼90%的Executor進程可能根本就沒有task執行,也就是白白浪費了寶貴的內存和CPU資源!所以Spark官網建議的設置原則是,設置該參數爲num-executors * executor-cores的2~3倍較爲合適,例如,Executor的總CPU core數量爲300個,那麼設置1000個task是能夠的,此時能夠充分地利用Spark集羣的資源,也就是說,1個cpu core併發跑2~3個task是較爲合適的。
spark.memory.fraction、spark.memory.storageFraction
參數說明和調優建議:參見個人另一篇文章 【Spark調優】內存模型與參數調優
上一篇:【Spark調優】Kryo序列化