spark的數據本地性(data locality)
Spark其中一個特性就是數據本地性,簡單的說就是“移動數據不如移動計算”。
因爲數據在網絡傳輸中會有不小的I/O消耗,並且傳輸距離越長消耗越大。
所以,數據本地性可以理解爲數據傳輸距離,而我們的目的就是避免數據在網絡中傳輸或儘量減少傳輸的距離。
根據傳輸的距離,我們可以對數據本地性根據傳輸距離進行分級。
查看Spark Web UI任務信息,我們可以看到下面的信息,其中Locality Level 一欄就是數據本地性的情況。
數據本地性級別劃分
- PROCESS_LOCAL:要處理的數據在同一個本地進程,
即數據和Task在同一個Excutor JVM中。
這種情況是RDD的數據經過緩存,此時不需要網絡傳輸,是最優locality。(但是數據要先緩存)。 - NODE_LOCAL:分兩種情況:
一是數據和Task在同一節點上的不同executor中;
二是數據HDFS和Task在同一個結點上,
此時需要進行進程間進行傳輸,速度比PROCESS_LOCAL略慢。 - NO_PREF:數據從哪訪問都一樣,相當於沒有數據本地性
一般值從Mysql之類的數據源讀取數據。 - RACK_LOCAL:數據與Task在同機架的不同節點
此時需要通過網絡傳輸,速度比NODE_LOCAL慢。 - ANY:數據和Task可能在集羣的任何地方,
性能最差,一般出現這種情況就該排查原因了
相關參數
Spark程序調度過程中不一定嚴格按照計算出來的數據本地性進行執行。
因爲我們的任務是並行執行的,但是Executor的core資源有限,在你計算出來最優本地性的時候也許資源被佔用。
此時如果我們降級到其他本地性級別也許整體效率更高。
所以,我們可以通過一些參數,控制等待時間,
一旦到達等待時間仍然沒有獲得資源,就嘗試降低本地性級別讓其他Excutor 執行。
相關參數如下:
參數 | 含義 | 默認值 |
---|---|---|
spark.locality.wait | 設置所有級別的數據本地性 |
默認:3s |
spark.locality.wait.process | 多長時間等不到PROCESS_LOCAL就降級 | 默認:spark.locality.wait |
spark.locality.wait.node | 多長時間等不到NODE_LOCAL就降級 | 默認:spark.locality.wait |
spark.locality.wait.rack | 多長時間等不到RACK_LOCAL就降級 | 默認:spark.locality.wait |
降級順序如下: