最近提交一個spark應用以後發現執行很是慢,點開spark web ui以後發現卡在一個job的一個stage上,這個stage有100000個task,可是絕大部分task都分配到兩個executor上,其餘executor很是空閒,what happened?html
查看spark task分配邏輯發現,有一個data locality即數據本地性的特性,詳見 http://www.javashuo.com/article/p-alrnbbhk-g.html
即會按照locality級別的優先級來分配任務,數據本地性的優先級是:PROCESS_LOCAL, NODE_LOCAL, NO_PREF, RACK_LOCAL, ANY,而且在優先級之間還有一個delay,node
spark.locality.waitweb
進一步查看目前集羣的部署結構,發現datanode和nodemanager並無部署到一塊,因此spark在分配NODE_LOCAL類型task的時候,只有兩個executor知足條件,因此絕大部分任務都分配到這兩個executor上,經過設置app
spark.locality.wait=0大數據
解決問題;ui
ps:存儲和計算(即datanode和nodemanager)要麼徹底分開獨立部署,要麼徹底部署在一塊兒,不要一部分分開部署,一部分部署在一塊兒,若是必定要這樣,不要開啓數據本地化特性;spa