淺談spark的數據本地性(data locality)

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

降級順序如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章