54 效能調優之調節資料本地化等待時長

2021-07-31 03:15:59 字數 1979 閱讀 2901

本文為《spark大型電商專案實戰》 系列文章之一,主要介紹在實際專案中通過調節資料本地化等待時長進行效能優化。

但是呢,通常來說,有時事與願違,可能 task 沒有機會分配到它的資料所在的節點,可能那個節點的計算資源和計算能力都滿了,通常來說,這時 spark 會等待一段時間,預設情況下是3s鐘(不是絕對的,還有很多種情況,對不同的本地化級別,都會去等待),到最後,實在是等待不了了,就會選擇乙個比較差的本地化級別,比如說,將 task 分配到靠它要計算的資料所在節點比較近的乙個節點,然後進行計算。

但是對於第二種情況,通常來說,肯定是要發生資料傳輸,task 會通過其所在節點的 blockmanager 來獲取資料,blockmanager 發現自己本地沒有資料,會通過乙個 getremote() 方法,通過 transferservice(網路資料傳輸元件)從資料所在節點的 blockmanager 中獲取資料,通過網路傳輸回task所在節點。

對於我們來說,當然不希望是類似於第二種情況的了。最好的當然是 task 和資料在乙個節點上,直接從本地 executor 的 blockmanager 中獲取資料,使用純記憶體,或者帶一點磁碟 io。如果要通過網路傳輸資料的話,效能肯定會下降的,大量網路傳輸以及磁碟 io 都是效能的殺手。

process_local:程序本地化,**和資料在同乙個程序中,也就是在同乙個executor 中。計算資料的 task 由 executor 執行,資料在 executor 的 blockmanager 中,這種效能最好。

node_local:節點本地化,**和資料在同乙個節點中。比如說,資料作為乙個hdfs block 塊就在節點上,而 task 在節點上某個 executor 中執行,或者是資料和 task 在乙個節點上的不同 executor 中,此時資料需要在程序間進行傳輸,效能稍次,不過也還不錯。

no_pref:對於task來說,資料從**獲取都一樣,沒有好壞之分。

rack_local:機架本地化,資料和 task 在乙個機架的兩個節點上,資料需要通過網路在節點之間進行傳輸,效能更次些。

any:資料和 task 可能在集群中的任何地方,而且不在乙個機架中,效能最差。

我們什麼時候要調節這個引數?

首先觀察 spark 作業的執行日誌,推薦大家在測試的時候先用 client 模式,在本地就直接可以看到比較全的日誌。日誌裡面會顯示:starting task……,process local、node local,觀察大部分task的資料本地化級別。

如果大多都是process_local,那就不用調節了,效能已經很好了,如果是發現好多的級別都是node_localany,那麼最好就去調節一下資料本地化的等待時長。要反覆調節,每次調節完以後,再來執行,觀察日誌,看看大部分的 task 的本地化級別有沒有提公升,然後看看整個 spark 作業的執行時間有沒有縮短。不要本末倒置,本地化級別倒是提公升了,但是因為大量的等待時長,spark 作業的執行時間反而增加了,那就還是不要調節了。

怎麼調節?

spark.locality.wait預設是3s這個引數是綜合性的,還有三個子引數分別為spark.locality.wait.processspark.locality.wait.nodespark.locality.wait.rack,預設情況下,這3個的等待時長和spark.locality.wait是一樣的,都是3s,可以調節為6s或10s,具體調節數值需要根據日誌資訊和調節後的結果調整。

在**中可以使用

new sparkconf()

.set("spark.locality.wait", "10")

進行設定等待時長,在專案中不再演示。

《spark 大型電商專案實戰》原始碼:

Spark效能調優系列 資料本地化

背景 資料本地化對於spark job效能有著巨大的影響,如果資料以及要計算它的 是一起的,那麼效能當然會非常高。但是如果資料與計算它的 是分開的,那麼其中之一必須到另外一方機器上,通常來說,移動 到其它節點,會比移動資料到 所在的節點上,速度要快的多。因為 較小,spark也正是基於這個資料本地化...

spark效能調優 本地化等待時長

本地化級別 1.程序本地化 2.節點本地化 3.機架本地化 4.any 都沒有 但是,通常來說,有時候,事與願違,可能task沒有機會分配到它的資料所在的節點,可能那個節點的計算資源和計算能力都滿了,所以,這種時候,通常倆說,spark會等待一段時間,預設情況下是3s 不是絕對的,還有很多情況,對不...

Spark效能調優4 本地化等待時間

spark 在driver 上,對的每乙個 stage 的task 進行分配之前,都會計算出每個 task 要計算的是哪個分片資料,rdd的某個 partition spark 的task 分配演算法,優先,會希望每個 task 正好分配到它要計算的資料所在的節點,這樣的話,就不用在網路間傳輸資料 ...