57 Spark效能優化之資料本地化

2021-09-10 02:33:16 字數 1590 閱讀 9283

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

資料本地化,指的是,資料離計算它的**有多近。基於資料距離**的距離,有幾種資料本地化級別:

process_local:資料和計算它的**在同乙個jvm程序中。

node_local:資料和計算它的**在乙個節點上,但是不在乙個程序中,比如在不同的executor程序中,或者是資料在hdfs檔案的block中。

no_pref:資料從**過來,效能都是一樣的。

rack_local:資料和計算它的**在乙個機架上。

any:資料可能在任意地方,比如其他網路環境內,或者其他機架上。

資料本地化原理.png

task要處理的partition的資料,在某乙個executor中,taskscheduler首先會盡量用最好的本地化級別去啟動task,也就是說,會盡量在哪個包含了要處理的partition的executor中,去啟動task

此時,executor已經再執行好幾個task了,沒有空閒資源來執行這個task

預設情況下,spark會等待一會,等待executor什麼時候可以空閒出乙個cpu core,從而來啟動這個task,讓它實現最好的本地化級別

但是如果等待了一會(時間是可以調優的,通過引數設定),發現始終沒有等到executor的core釋放,那麼會放大乙個級別,去嘗試啟動這個task

如果這個rdd之前持久化過,task會去呼叫rdd的iterator()方法,然後通過executor關聯的blockmanager,來嘗試獲取資料,blockmanager底層,首先嘗試從getlocal()在本地找資料,如果沒有找到的話,那麼用getremote(),通過blocktransferservice,鏈結到有資料的blockmanager,來獲取資料

如果沒有持久化過,那麼就computerorreadcheckpoint()

如果還是不能啟動,繼續放大級別

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。

Spark效能優化之Shuffle效能調優

一 shuffle效能調優 1,問題 shuffle output file lost?真正的原因是gc導致的!如果gc尤其是full gc產生通常會導致執行緒停止工作,這個時候下乙個stage的task在預設情況下就會嘗試重試來獲取資料,一般重試3次每次重試的時間為5s,也就是說預設情況下15s內...

Spark效能優化 優化資料結構

1 優先使用陣列以及字串,而不是集合類。也就是說,優先用array,而不是arraylist linkedlist hashmap等集合。比如,有個list list new arraylist 將其替換為int arr new int。這樣的話,array既比list少了額外資訊的儲存開銷,還能使...

Spark效能優化指南 資料傾斜

調優概述 有的時候,我們可能會遇到大資料計算中乙個最棘手的問題 資料傾斜,此時spark作業的效能會比期望差很多。資料傾斜調優,就是使用各種技術方案解決不同型別的資料傾斜問題,以保證spark作業的效能。資料傾斜發生時的現象 絕大多數task執行得都非常快,但個別task執行極慢。比如,總共有100...