Flink的广播变量是什么?详细的操作步骤有哪些?
Flink支持广播变量,就是将数据广播到具体的taskmanager上,数据存储在内存中,这样可以减缓大量的shuffle操作;
比如在数据join阶段,不可避免的就是大量的shuffle操作,我们可以把其中一个dataSet广播出去,一直加载到taskManager的内存中,可以直接在内存中拿数据,避免了大量的shuffle,导致集群性能下降;
广播变量创建后,它可以运行在集群中的任何function上,而不需要多次传递给集群节点。另外需要记住,不应该修改广播变量,这样才能确保每个节点获取到的值都是一致的。
一句话解释,可以理解为是一个公共的共享变量,我们可以把一个dataset 数据集广播出去,然后不同的task在节点上都能够获取到,这个数据在每个节点上只会存在一份。如果不使用broadcast,则在每个节点中的每个task中都需要拷贝一份dataset数据集,比较浪费内存(也就是一个节点中可能会存在多份dataset数据)。
注意:因为广播变量是要把dataset广播到TaskManager节点内存中,所以广播的数据量不能太大,否则会出现OOM这样的问题
Broadcast:Broadcast是通过withBroadcastSet(dataset,string)来注册的
Access:通过getRuntimeContext().getBroadcastVariable(String)访问广播变量

可以理解广播就是一个公共的共享变量
将一个数据集广播后,不同的Task都可以在节点上获取到
每个节点 只存一份
如果不使用广播,每一个Task都会拷贝一份数据集,造成内存资源浪费
用法
在需要使用广播的操作后,使用 withBroadcastSet 创建广播
在操作中,使用getRuntimeContext.getBroadcastVariable [广播数据类型] ( 广播名 )获取广播变量
示例
创建一个 学生 数据集,包含以下数据
将该数据,发布到广播。
再创建一个 成绩 数据集,
请通过广播获取到学生姓名,将数据转换为
步骤
1. 获取批处理运行环境
2. 分别创建两个数据集
3. 使用 RichMapFunction 对 成绩 数据集进行map转换
4. 在数据集调用 map 方法后,调用 withBroadcastSet 将 学生 数据集创建广播
5. 实现 RichMapFunction
将成绩数据(学生ID,学科,成绩) -> (学生姓名,学科,成绩)
重写 open 方法中,获取广播数据
在 map 方法中使用广播进行转换
6. 打印测试
参考代码
