spark
在driver
上,對的每乙個
stage
的task
,進行分配之前,都會計算出每個
task
要計算的是哪個分片資料,
rdd的某個
partition
;spark
的task
分配演算法,優先,會希望每個
task
正好分配到它要計算的資料所在的節點,這樣的話,就不用在網路間傳輸資料;
但是呢,通常來說,有時,事與願違,可能
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.locality.wait,預設是3s
我們什麼時候要調節這個引數?
觀察日誌,
spark
作業的執行日誌,推薦大家在測試的時候,先用
client
模式,在本地就直接可以看到比較全的日誌。
日誌裡面會顯示,
starting task
。。。,
process local
、node local
觀察大部分
task
的資料本地化級別
如果大多都是
process_local
,那就不用調節了
如果是發現,好多的級別都是
node_local
、any
,那麼最好就去調節一下資料本地化的等待時長
調節完,應該是要反覆調節,每次調節完以後,再來執行,觀察日誌
看看大部分的
task
的本地化級別有沒有提公升;看看,整個
spark
作業的執行時間有沒有縮短
你別本末倒置,本地化級別倒是提公升了,但是因為大量的等待時長,
spark
作業的執行時間反而增加了,那就還是不要調節了
怎麼調節?
spark.locality.wait,預設是3s;
6s,10s
預設情況下,下面
3個的等待時長,都是跟上面那個是一樣的,都是3s
spark效能調優 本地化等待時長
本地化級別 1.程序本地化 2.節點本地化 3.機架本地化 4.any 都沒有 但是,通常來說,有時候,事與願違,可能task沒有機會分配到它的資料所在的節點,可能那個節點的計算資源和計算能力都滿了,所以,這種時候,通常倆說,spark會等待一段時間,預設情況下是3s 不是絕對的,還有很多情況,對不...
Spark效能調優系列 資料本地化
背景 資料本地化對於spark job效能有著巨大的影響,如果資料以及要計算它的 是一起的,那麼效能當然會非常高。但是如果資料與計算它的 是分開的,那麼其中之一必須到另外一方機器上,通常來說,移動 到其它節點,會比移動資料到 所在的節點上,速度要快的多。因為 較小,spark也正是基於這個資料本地化...
54 效能調優之調節資料本地化等待時長
本文為 spark大型電商專案實戰 系列文章之一,主要介紹在實際專案中通過調節資料本地化等待時長進行效能優化。但是呢,通常來說,有時事與願違,可能 task 沒有機會分配到它的資料所在的節點,可能那個節點的計算資源和計算能力都滿了,通常來說,這時 spark 會等待一段時間,預設情況下是3s鐘 不是...