spark的task分佈不均勻,某些executor沒有領取任務

今天執行的一個spark job的,共計有30000個任務,分配了100個executor,但是大部分任務都分佈在了某些executor上。有些excutor只執行了1個任務。

經查資料與spark數據本地化有關。

先說解決方案:提交任務時候加參數 --conf spark.locality.wait=0

 

原文鏈接:https://blog.csdn.net/zhouyan8603/article/details/84197190

1.概念:task在執行前都會獲取數據的分區信息進行分配,總是會優先將其分配到它要計算的數據所在節點,儘可能的減少網絡傳輸

2.過程:一般會默認3s,重試5次的去分配,一旦超時失敗,將會選擇一個比上一個本地級別差的級別再一次分配,如果發生了數據傳輸,那麼task首先通過blockmanager獲取數據,如果本地沒有數據,則通過getRemote方法從數據所在節點的blockmanager獲取數據並返回至task所在節點

3.級別

PROCESS_LOCAL:進程本地化,性能最好。指代碼和數據在同一個進程中,也就是同一個executor中;計算數據的task由executor執行,此時數據在executor的blockmanager裏
NODE_LOCAL:節點本地化。代碼和數據在同一個節點中,數據存儲爲節點的hdfs block數據塊,task在節點的某個executror執行;或者數據和task在同一個節點不同的executor中,數據需要跨進程傳輸

NO_PREF:數據從哪裏獲取都一樣,比如從數據庫中獲取數據,對於task而言沒有區別

RACK_LOCAL:數據和task在一個機架的兩個節點上,數據需要通過網絡在節點之間進行傳輸

ANY:數據和task可能在集羣中的任何地方,而且不在一個機架中,性能最差

4.調節:spark.locality.wait參數默認是3s,默認情況下,以下幾個參數都是以spark.locality.wait爲默認值,

spark.locality.wait.process
spark.locality.wait.node
spark.locality.wait.rack

實際情況中通過調節不同值達到最優的計算分配效果

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