11.15 Spark性能優化(8)——數據本地化

Spark性能優化(8)——數據本地化

數據本地化的背景

數據本地化對於Spark Job性能有著巨大的影響。如果數據以及要計算它的代碼是在一起的,那麼性能當然會非常高。但是,如果數據和計算它的代碼是分開的,那麼其中之一必須到另外一方的機器上。通常來說,移動代碼到其他節點,會比移動數據到代碼所在的節點上去,速度要快得多,因為代碼比較小。Spark也正是基於這個數據本地化的原則來構建task調度算法的。

數據本地化

數據本地化,指的是,數據離計算它的代碼有多近。

基於數據距離代碼的距離,有幾種數據本地化級別

  1. PROCESS_LOCAL:數據和計算它的代碼在同一個JVM進程中。
  2. NODE_LOCAL:數據和計算它的代碼在一個節點上,但是不在一個進程中,比如在不同的executor進程中,或者是數據在HDFS文件的block中。
  3. NO_PREF:數據從哪裡過來,性能都是一樣的。
  4. RACK_LOCAL:數據和計算它的代碼在一個機架上。
  5. ANY:數據可能在任意地方,比如其他網絡環境內,或者其他機架上。
Spark性能優化(8)——數據本地化


數據本地化的設置:

Spark傾向於使用最好的本地化級別來調度task,但是這是不可能的。如果沒有任何未處理的數據在空閒的executor上,那麼Spark就會放低本地化級別。

有兩個選擇:

  • 第一,等待,直到executor上的cpu釋放出來,那麼就分配task過去;
  • 第二,立即在任意一個executor上啟動一個task。

Spark默認會等待一會兒,來期望task要處理的數據所在的節點上的executor空閒出一個cpu,從而將task分配過去。只要超過了時間,那麼Spark就會將task分配到其他任意一個空閒的executor上。

可以設置參數,spark.locality系列參數,來調節Spark等待task可以進行數據本地化的時間。

spark.locality.wait(3000毫秒) 

spark.locality.wait.node
spark.locality.wait.process
spark.locality.wait.rack。
Spark性能優化(8)——數據本地化


分享到:


相關文章: