spark如何合理的分配資源(executor-memory,num-executors,executor-cores)

以下爲經驗之談,結合個人對spark框架的理解,如有錯誤,歡迎指正。

以yarn爲例:

一。executor-memory,在集羣資源允許的情況下,當然越多越好,個人建議上限爲單個containers最大值的75%。

二。num-executors和executor-cores,由於執行任務的併發數=num-executors * executor-cores 。所以這一點經常會思考是100*1好,還是50*2比較好。

1.假設shuffer壓力不大,

①在數據分佈均勻,executor-memory=8G,100*1是比50*2的理論上是要好些的,因爲這樣單個任務所擁有的內存會更充足,gc的時間會更少。

②在數據分佈不均勻的情況下,可設置executor-memory=16G,50*2理論上是比100*1效果要好些的,因爲如果設置爲100*1,數據量小的任務會很快執行完,造成executor空閒。資源浪費。且在數據不均勻的情況下,executor-memory要適當提高,以免oom

2.若shuffer有一定壓力。

shuffer的本質是在網絡磁盤IO,假設每個executor都分佈在不同的節點,那麼過多的executor-num會造成網絡之間的IO過大,shuffer read可能造成timeout。所以這個時候理論上是設置較小的executor-num,較多的executor-cores,和較大的executor-memory是比較合理。以上文爲例: executor-memory=32G num-executors=25 executor-cores =4

3.若任務主要是sc.textFile().map().saveAsTextFile。那麼其瓶頸主要是在讀取hdfs文件,以及業務代碼運行效率上。在單個節點給予過多的executor-cores,可能造成節點和hdfs的IO打滿。那麼這個時候應該適當降低executor-cores,增加executor-num。

三。

總之,調參的本質是要思考任務的瓶頸在哪裏,因爲所有的參數到最後基本上都是內存,磁盤IO,網絡IO這些東西。除此之外,spark的其他參數,如 spark shuffer調優 這一系列的參數,也是需要參考調整的

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章