Flink的廣播變量是什么?詳細(xì)的操作步驟有哪些?
Flink支持廣播變量,就是將數(shù)據(jù)廣播到具體的taskmanager上,數(shù)據(jù)存儲(chǔ)在內(nèi)存中,這樣可以減緩大量的shuffle操作;
比如在數(shù)據(jù)join階段,不可避免的就是大量的shuffle操作,我們可以把其中一個(gè)dataSet廣播出去,一直加載到taskManager的內(nèi)存中,可以直接在內(nèi)存中拿數(shù)據(jù),避免了大量的shuffle,導(dǎo)致集群性能下降;
廣播變量創(chuàng)建后,它可以運(yùn)行在集群中的任何function上,而不需要多次傳遞給集群節(jié)點(diǎn)。另外需要記住,不應(yīng)該修改廣播變量,這樣才能確保每個(gè)節(jié)點(diǎn)獲取到的值都是一致的。
一句話解釋,可以理解為是一個(gè)公共的共享變量,我們可以把一個(gè)dataset 數(shù)據(jù)集廣播出去,然后不同的task在節(jié)點(diǎn)上都能夠獲取到,這個(gè)數(shù)據(jù)在每個(gè)節(jié)點(diǎn)上只會(huì)存在一份。如果不使用broadcast,則在每個(gè)節(jié)點(diǎn)中的每個(gè)task中都需要拷貝一份dataset數(shù)據(jù)集,比較浪費(fèi)內(nèi)存(也就是一個(gè)節(jié)點(diǎn)中可能會(huì)存在多份dataset數(shù)據(jù))。
注意:因?yàn)閺V播變量是要把dataset廣播到TaskManager節(jié)點(diǎn)內(nèi)存中,所以廣播的數(shù)據(jù)量不能太大,否則會(huì)出現(xiàn)OOM這樣的問題
Broadcast:Broadcast是通過withBroadcastSet(dataset,string)來注冊的
Access:通過getRuntimeContext().getBroadcastVariable(String)訪問廣播變量

可以理解廣播就是一個(gè)公共的共享變量
將一個(gè)數(shù)據(jù)集廣播后,不同的Task都可以在節(jié)點(diǎn)上獲取到
每個(gè)節(jié)點(diǎn) 只存一份
如果不使用廣播,每一個(gè)Task都會(huì)拷貝一份數(shù)據(jù)集,造成內(nèi)存資源浪費(fèi)
用法
在需要使用廣播的操作后,使用?withBroadcastSet?創(chuàng)建廣播
在操作中,使用getRuntimeContext.getBroadcastVariable [廣播數(shù)據(jù)類型] ( 廣播名 )獲取廣播變量
示例
創(chuàng)建一個(gè) 學(xué)生 數(shù)據(jù)集,包含以下數(shù)據(jù)
將該數(shù)據(jù),發(fā)布到廣播。
再創(chuàng)建一個(gè) 成績 數(shù)據(jù)集,
請通過廣播獲取到學(xué)生姓名,將數(shù)據(jù)轉(zhuǎn)換為
步驟
1. 獲取批處理運(yùn)行環(huán)境
2. 分別創(chuàng)建兩個(gè)數(shù)據(jù)集
3. 使用 RichMapFunction 對 成績 數(shù)據(jù)集進(jìn)行map轉(zhuǎn)換
4. 在數(shù)據(jù)集調(diào)用 map 方法后,調(diào)用 withBroadcastSet 將 學(xué)生 數(shù)據(jù)集創(chuàng)建廣播
5. 實(shí)現(xiàn) RichMapFunction
將成績數(shù)據(jù)(學(xué)生ID,學(xué)科,成績) -> (學(xué)生姓名,學(xué)科,成績)
重寫 open 方法中,獲取廣播數(shù)據(jù)
在 map 方法中使用廣播進(jìn)行轉(zhuǎn)換
6. 打印測試
參考代碼
