前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >12-Broadcast广播变量

12-Broadcast广播变量

作者头像
王知无-import_bigdata
修改2019-03-15 17:16:44
9160
修改2019-03-15 17:16:44
举报

戳更多文章:

1-Flink入门

2-本地环境搭建&构建第一个Flink应用

3-DataSet API

4-DataSteam API

5-集群部署

6-分布式缓存

7-重启策略

8-Flink中的窗口

9-Flink中的Time

1广播变量简介

在Flink中,同一个算子可能存在若干个不同的并行实例,计算过程可能不在同一个Slot中进行,不同算子之间更是如此,因此不同算子的计算数据之间不能像Java数组之间一样互相访问,而广播变量Broadcast便是解决这种情况的。

我们可以把广播变量理解为是一个公共的共享变量,我们可以把一个dataset 数据集广播出去,然后不同的task在节点上都能够获取到,这个数据在每个节点上只会存在一份。

2用法

代码语言:javascript
复制
1:初始化数据
  DataSet<Integer> num = env.fromElements(1, 2, 3)
  2:广播数据
  .withBroadcastSet(toBroadcast, "num");
  3:获取数据
  Collection<Integer> broadcastSet = getRuntimeContext().getBroadcastVariable("num");

3注意事项

使用广播状态,task 之间不会相互通信

只有广播的一边可以修改广播状态的内容。用户必须保证所有 operator 并发实例上对广播状态的 修改行为都是一致的。或者说,如果不同的并发实例拥有不同的广播状态内容,将导致不一致的结果。

广播状态中事件的顺序在各个并发实例中可能不尽相同

广播流的元素保证了将所有元素(最终)都发给下游所有的并发实例,但是元素的到达的顺序可能在并发实例之间并不相同。因此,对广播状态的修改不能依赖于输入数据的顺序。

所有operator task都会快照下他们的广播状态

在checkpoint时,所有的 task 都会 checkpoint 下他们的广播状态,随着并发度的增加,checkpoint 的大小也会随之增加。

广播变量存在内存中

广播出去的变量存在于每个节点的内存中,所以这个数据集不能太大,百兆左右可以接受,Gb不能接受。

4实战案例

代码语言:javascript
复制
public class BroadCastTest {

    public static void main(String[] args) throws Exception{
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        //1.封装一个DataSet
        DataSet<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();
            @Override
            public void open(Configuration parameters) throws Exception {
                // 3. 获取广播的DataSet数据 作为一个Collection
                Collection<Integer> broadcastSet = getRuntimeContext().getBroadcastVariable("number");
                list.addAll(broadcastSet);
            }

            @Override
            public String map(String value) throws Exception {
                return value + ": "+ list;
            }
        }).withBroadcastSet(broadcast, "number") 
            // 2. 广播的broadcast
          .printToErr();//打印到err方便查看
    }
}

输出结果:

代码语言:javascript
复制
a: [1, 2, 3]
b: [1, 2, 3]
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据技术与架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档