Flink 广播变量
廣播變量簡(jiǎn)介
在Flink中,同一個(gè)算子可能存在若干個(gè)不同的并行實(shí)例,計(jì)算過(guò)程可能不在同一個(gè)Slot中進(jìn)行,不同算子之間更是如此,因此不同算子的計(jì)算數(shù)據(jù)之間不能像Java數(shù)組之間一樣互相訪問(wèn),而廣播變量Broadcast便是解決這種情況的。
我們可以把廣播變量理解為是一個(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ù))。
用法
1:初始化數(shù)據(jù)DataSet<Integer> num = env.fromElements(1, 2, 3)2:廣播數(shù)據(jù).withBroadcastSet(toBroadcast, "num");3:獲取數(shù)據(jù)Collection<Integer> broadcastSet = getRuntimeContext().getBroadcastVariable("num");注意事項(xiàng)
使用廣播狀態(tài),task 之間不會(huì)相互通信
只有廣播的一邊可以修改廣播狀態(tài)的內(nèi)容。用戶必須保證所有 operator 并發(fā)實(shí)例上對(duì)廣播狀態(tài)的 修改行為都是一致的。或者說(shuō),如果不同的并發(fā)實(shí)例擁有不同的廣播狀態(tài)內(nèi)容,將導(dǎo)致不一致的結(jié)果。
廣播狀態(tài)中事件的順序在各個(gè)并發(fā)實(shí)例中可能不盡相同
廣播流的元素保證了將所有元素(最終)都發(fā)給下游所有的并發(fā)實(shí)例,但是元素的到達(dá)的順序可能在并發(fā)實(shí)例之間并不相同。因此,對(duì)廣播狀態(tài)的修改不能依賴于輸入數(shù)據(jù)的順序。
所有operator task都會(huì)快照下他們的廣播狀態(tài)
在checkpoint時(shí),所有的 task 都會(huì) checkpoint 下他們的廣播狀態(tài),隨著并發(fā)度的增加,checkpoint 的大小也會(huì)隨之增加
廣播變量存在內(nèi)存中
廣播出去的變量存在于每個(gè)節(jié)點(diǎn)的內(nèi)存中,所以這個(gè)數(shù)據(jù)集不能太大,百兆左右可以接受,Gb不能接受
案例
public class BroadCastTest {public static void main(String[] args) throws Exception{ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();//1.封裝一個(gè)DataSetDataSet<Integer> broadcast = env.fromElements(1, 2, 3);DataSet<String> data = env.fromElements("a", "b");data.map(new RichMapFunction<String, String>() {private List list = new ArrayList();@Overridepublic void open(Configuration parameters) throws Exception {// 3. 獲取廣播的DataSet數(shù)據(jù) 作為一個(gè)CollectionCollection<Integer> broadcastSet = getRuntimeContext().getBroadcastVariable("number");list.addAll(broadcastSet);}@Overridepublic String map(String value) throws Exception {return value + ": "+ list;}}).withBroadcastSet(broadcast, "number") // 2. 廣播的broadcast.printToErr();//打印到err方便查看} }輸出結(jié)果
a: [1, 2, 3] b: [1, 2, 3]總結(jié)
以上是生活随笔為你收集整理的Flink 广播变量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Flink 读取文本文件,聚合每一行的u
- 下一篇: Flink的重启策略