【Spark調優】提交job資源參數調優

 【場景】

  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.fractionspark.memory.storageFraction

  參數說明和調優建議:參見個人另一篇文章  【Spark調優】內存模型與參數調優

 

  下一篇:【Spark調優】Broadcast廣播變量 

  上一篇:【Spark調優】Kryo序列化

相關文章
相關標籤/搜索