Spark:資料本地化(調優)
阿新 • • 發佈:2018-12-16
- 資料本地化的級別:
PROCESS_LOCAL
task要計算的資料在本程序(Executor)的記憶體中。
NODE_LOCAL
- task所計算的資料在本節點所在的磁碟上。
- task所計算的資料在本節點其他Executor程序的記憶體中。
NO_PREF
task所計算的資料在關係型資料庫中,如mysql。
RACK_LOCAL
task所計算的資料在同機架的不同節點的磁碟或者Executor程序的記憶體中
ANY
跨機架。
- 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