Spark廣播變數知識點

2021-09-12 16:51:08 字數 2685 閱讀 5202

1,為什麼要使用廣播變數?

舉乙個簡單的例子,我們要處理乙份log檔案,裡面有ip位址。

20090121000132095572000|125.213.100.123|show.51.com|/shoplist.php?phpfile=shoplist2.php&style=1&s

通過切分我們可以拿到ip。現在要求我們通過這個ip得到這個ip屬於哪個省份。ip規則如下(簡單的一小部分):

1.0.1.0|1.0.3.255|16777472|16778239|亞洲|中國|福建|福州||電信|350100|china|cn|119.306239|26.075302

1.0.8.0|1.0.15.255|16779264|16781311|亞洲|中國|廣東|廣州||電信|440100|china|cn|113.280637|23.125178

1.0.32.0|1.0.63.255|16785408|16793599|亞洲|中國|廣東|廣州||電信|440100|china|cn|113.280637|23.125178

1.1.0.0|1.1.0.255|16842752|16843007|亞洲|中國|福建|福州||電信|350100|china|cn|119.306239|26.075302

1.1.2.0|1.1.7.255|16843264|16844799|亞洲|中國|福建|福州||電信|350100|china|cn|119.306239|26.075302

1.1.8.0|1.1.63.255|16844800|16859135|亞洲|中國|廣東|廣州||電信|440100|china|cn|113.280637|23.125178

ip規則處理

//將ip轉換成十進位制

def ip2long(ip: string): long = 

ipnum

}//二分法快速匹配ip規則

def binarysearch(lines: array[(long, long, string)], ip: long): int = 

} -1

}

將來資料量可能很大,所以ip規則肯定是儲存在hdfs中的,這樣在讀取的時候根據切片數量,會啟動相應的task,但是資料切片中就可能不會包含所有的ip規則,然後你處理的log檔案獲取的ip就找不到對應的省份了。這樣就出現了問題。所以現在需要每個task都會獲取到全部的ip規則。但是ip規則的資料是分片存放的,怎樣讓task獲取到全部的ip規則呢?這時就需要將每個切片的ip規則拉取到spark submit(driver)端,然後再通過廣播變數的形式下發到每個executor中,每個executor都會持有乙份完整的ip規則,這樣task在處理log檔案資料的時候,就可以拉取executor中的ip規則了。

廣播變數的好處,不是每個task乙份變數副本,而是變成每個節點的executor才乙份副本。這樣的話,

就可以讓變數產生的副本大大減少。

廣播變數,很簡單

其實就是sparkcontext的broadcast()方法,傳入你要廣播的變數,即可

final broadcast>> datehourextractmapbroadcast = 

sc.broadcast(fastutildatehourextractmap);

使用廣播變數的時候

直接呼叫廣播變數(broadcast型別)的value() / getvalue() 

可以獲取到之前封裝的廣播變數

task在執行的時候,想要使用廣播變數中的資料,此時首先會在自己本地的executor對應的blockmanager中,

嘗試獲取變數副本;如果本地沒有,那麼就從driver遠端拉取變數副本,並儲存在本地的blockmanager中;

此後這個executor上的task,都會直接使用本地的blockmanager中的副本。

executor的blockmanager除了從driver上拉取,也可能從其他節點的blockmanager上拉取變數副本。

httpbroadcast     torrentbroadcast(預設)

負責管理某個executor對應的記憶體和磁碟上的資料,嘗試在本地blockmanager中找map

舉例來說

50個executor,1000個task。乙個map,10m。

預設情況下,1000個task,1000份副本。10g的資料,網路傳輸,在集群中,耗費10g的記憶體資源。

如果使用了廣播變數。50個execurtor,50個副本。500m的資料,網路傳輸,

而且不一定都是從driver傳輸到每個節點,還可能是就近從最近的節點的executor的bockmanager

上拉取變數副本,網路傳輸速度大大增加;500m的記憶體消耗。

10000m,500m,20倍。20倍~以上的網路傳輸效能消耗的降低;20倍的記憶體消耗的減少。

對效能的提公升和影響,還是很客觀的。

雖然說,不一定會對效能產生決定性的作用。比如執行30分鐘的spark作業,可能做了廣播變數以後,

速度快了2分鐘,或者5分鐘。但是一點一滴的調優,積少成多。最後還是會有效果的。

沒有經過任何調優手段的spark作業,16個小時;三板斧下來,就可以到5個小時;

然後非常重要的乙個調優,影響特別大,shuffle調優,2~3個小時;應用了10個以上的效能調優的技術點

,jvm+廣播,30分鐘。16小時~30分鐘。

那最後我們做一下,怎麼做?就是把datehourextractmap做成廣播變數broadcast

Spark中廣播變數知識點

1,為什麼要使用廣播變數?舉乙個簡單的例子,我們要處理乙份log檔案,裡面有ip位址。20090121000132095572000 125.213.100.123 show.51.com shoplist.php?phpfile shoplist2.php style 1 s 通過切分我們可以拿到...

變數知識點

1預定義變數 1 server server addr 當前執行指令碼所在的伺服器的ip位址 2 server server name 伺服器主機的名稱 3 server request method 訪問頁面時的請求方法,如get,post,head,put等,如果請求的方式是head,php指令...

Spark的廣播變數

將每個task都要計算的資料設定成廣播變數,如果不設定成廣播變數,則每個 task 都會儲存乙份這樣一模一樣的資料,這樣就占用了很多的儲存空間,將共享變數設定成廣播變數後只在乙個 excuter 裡面儲存這樣乙份 共享資料,這個 excuter 裡面的task 計算的時候共享這樣乙份資料,這樣就減少...