1. 數據本地化的級別:
① PROCESS_LOCAL
task要計算的數據在本進程(Executor)的內存中。
② NODE_LOCAL
a) task所計算的數據在本節點所在的磁盤上。
b) task所計算的數據在本節點其他Executor進程的內存中。
③ NO_PREF
task所計算的數據在關系型數據庫中,如mysql。
④ RACK_LOCAL
task所計算的數據在同機架的不同節點的磁盤或者Executor進程的內存中
⑤ ANY
跨機架。
2. Spark數據本地化調優:
Spark中任務調度時,TaskScheduler在分發之前需要依據數據的位置來分發,最好將task分發到數據所在的節點上,如果TaskScheduler分發的task在默認3s依然無法執行的話,TaskScheduler會重新發送這個task到相同的Executor中去執行,會重試5次,如果依然無法執行,那么TaskScheduler會降低一級數據本地化的級別再次發送task。
如上圖中,會先嘗試1,PROCESS_LOCAL數據本地化級別,如果重試5次每次等待3s,會默認這個Executor計算資源滿了,那么會降低一級數據本地化級別到2,NODE_LOCAL,如果還是重試5次每次等待3s還是失敗,那么還是會降低一級數據本地化級別到3,RACK_LOCAL。這樣數據就會有網絡傳輸,降低了執行效率。
① 如何提高數據本地化的級別?
可以增加每次發送task的等待時間(默認都是3s),將3s倍數調大, 結合WEBUI來調節:
• spark.locality.wait
• spark.locality.wait.process
• spark.locality.wait.node
• spark.locality.wait.rack
注意:等待時間不能調大很大,調整數據本地化的級別不要本末倒置,雖然每一個task的本地化級別是最高了,但整個Application的執行時間反而加長。
② 如何查看數據本地化的級別?
通過日志或者WEBUI