1. 程式人生 > >【Spark調優】數據本地化

【Spark調優】數據本地化

很多 ref proc 運行 配置參數 一段 exec tro 建議

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

  數據本地化,是指數據離計算它的代碼距離有多近,有幾種數據本地化級別:

1、PROCESS_LOCAL:數據和計算它的代碼在同一個JVM進程中,對應spark是指的在一個executor內,這種距離最近,性能最好。
2、NODE_LOCAL

:數據和計算它的代碼在一個節點上,但是不在一個進程中,比如在不同的executor進程中,或者是數據在HDFS文件的block中,這種距離遠些,性能次之。

盡量控制在前2種。 如下計算代碼和匹配數據距離依次更遠,性能依次變的更差。
3、NO_PREF:從任何地方訪問數據速度都是一樣,不關心數據的位置。
4、RACK_LOCAL:數據和計算它的代碼在一個機架上。
5、ANY:數據可能在任意地方,比如其他網絡環境內,或者其他機架上。

註:Spark UI中,在stage中看task列表,Locality Level列可以看到該task的數據本地化級別。  

  實際使用過程中,資源是有限的。

例如,如果一個executor在某一時刻已經啟動了很多task,沒有資源可以繼續啟動新task。此時,應該選擇等待一段時間。

  • 如果等待時間內,有task完成處理釋放了資源,那麽executor為新task分配資源,此時保持PROCESS_LOCAL。
  • 如果超出等待時間,所有task都還沒完成,新task未獲取到資源,此時需要降級為NODE_LOCAL,由Node分配資源來運行新task。

  Spark為task資源等待時間提供了配置參數:

  • spark.locality.wait

  是spark切換每個級別的等待間隔時間,默認值3秒過短,生產上建議配置到50~60秒。

  也可以細化到每個級別的等待間隔時間配置:

  • spark.locality.process
  • spark.locality.node
  • spark.locality.rack

  個人建議越在前面的配置略大些好,例如50~60秒。

【Spark調優】數據本地化