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


 【場景】

  Spark提交作業job的時候要指定該job可以使用的CPU、內存等資源參數,生產環境中,任務資源分配不足會導致該job執行中斷、失敗等問題,所以對Spark的job資源參數分配調優非常重要。

  spark提交作業,yarn-cluster模式示例:

  ./bin/spark-submit\

  --class com.ww.rdd.wordcount \

  --master yarn \

  --deploy-mode cluster \ 
  --executor-memory 4G \
  --num-executors 50 \

  --driver-memory 1G \

  --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序列化

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM