欢迎光临散文网 会员登陆 & 注册

Flink的广播变量是什么?详细的操作步骤有哪些?

2023-07-20 16:07 作者:ingemar-  | 我要投稿

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. 打印测试



参考代码


Flink的广播变量是什么?详细的操作步骤有哪些?的评论 (共 条)

分享到微博请遵守国家法律