【Spark調優】數據本地化
數據本地化對於Spark Job性能有著巨大的影響,如果數據以及要計算它的代碼是在一起的,那麽性能當然會非常高。但是,如果數據和計算它的代碼是分開的,那麽其中之一必須到另外一方的機器上。移動代碼到其匹配的數據節點,會比移動大量數據到代碼所在的節點上去,速度要快得多,因為代碼比較小。Spark也正是基於這個數據本地化的原則來構建task調度算法。
數據本地化,是指數據離計算它的代碼距離有多近,有幾種數據本地化級別:
1、PROCESS_LOCAL:數據和計算它的代碼在同一個JVM進程中,對應spark是指的在一個executor內,這種距離最近,性能最好。
2、NODE_LOCAL
盡量控制在前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調優】數據本地化