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

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