最近提交一個spark應用之后發現執行非常慢,點開spark web ui之后發現卡在一個job的一個stage上,這個stage有100000個task,但是絕大部分task都分配到兩個executor上,其他executor非常空閑,what happened?
查看spark task分配邏輯發現,有一個data locality即數據本地性的特性,詳見 https://www.cnblogs.com/barneywill/p/10152497.html
即會按照locality級別的優先級來分配任務,數據本地性的優先級是:PROCESS_LOCAL, NODE_LOCAL, NO_PREF, RACK_LOCAL, ANY,並且在優先級之間還有一個delay,
spark.locality.wait
進一步查看目前集群的部署結構,發現datanode和nodemanager並沒有部署到一塊,所以spark在分配NODE_LOCAL類型task的時候,只有兩個executor滿足條件,所以絕大部分任務都分配到這兩個executor上,通過設置
spark.locality.wait=0
解決問題;
ps:存儲和計算(即datanode和nodemanager)要么完全分開獨立部署,要么完全部署在一起,不要一部分分開部署,一部分部署在一起,如果一定要這樣,不要開啟數據本地化特性;
