Spark性能優化---數據本地化

什麼是數據本地化

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

數據本地化,指的是,數據離計算它的代碼有多近。基於數據距離代碼的距離,在spark中共有幾種數據本地化級別:
1、PROCESS_LOCAL:數據和計算它的代碼在同一個JVM進程中。
2、NODE_LOCAL:數據和計算它的代碼在一個節點上,但是不在一個進程中,比如在不同的executor進程中,或者是數據在HDFS文件的block中。
3、NO_PREF:數據從哪裏過來,性能都是一樣的。
4、RACK_LOCAL:數據和計算它的代碼在一個機架上。
5、ANY:數據可能在任意地方,比如其他網絡環境內,或者其他機架上

如何基於數據本地化進行性能優化

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。

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