Flink broadcast的用法

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
简介: Flink broadcast的用法

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

在 flink 中, 针对某一个算子需要使用公共变量的情况下, 就可以把对应的数据给广播出去, 这样在所有的节点中都可以使用了. 典型的代码结构如下所示:

在一个算子中使用广播变量主要有两个步骤:

  1. 广播变量 (一般写在算子的后面即可)
  2. 使用 withBroadcastSet(data, “name”) 这个方法即可, name变量代表了获取该广播变量的名称
  3. 使用广播变量
  4. 使用方法主要是通过 RichFunction, 在 对应的 open( )方法中, 可以根据名称来获取对应的广播变量, 只需要一次获取, 就可以一直使用了, 具体方法如下:


dataSet.map(new RichMapFunction<String, String>() {

List bc;

@Override

public void open(Configuration parameters) throws Exception {

super.open(parameters);

// 2. 获取广播变量

this.bc = getRuntimeContext().getBroadcastVariable(“broadcastData”);

}

@Override

public String map(String s) throws Exception {

return s;

}

// 1. 将需要用的变量广播出去 (这一步可以写在后面)

}).withBroadcastSet(broadcastData, “broadcastData”).print();


下面以一个获取用户年龄的例子来演示一个常见的使用案例:


broadcastData 是一个包含用户 (姓名, 年龄) 的数据表


需要在另外一个算子中通过姓名查找年龄, 那么就需要把上表广播


public class BroadcastExample {
    public static void main(String[] args) throws Exception {
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(4);
        // 创建需要广播的 数据集 (name, age)
        Tuple2<String, Integer> john = new Tuple2<>("john", 23);
        Tuple2<String, Integer> tom = new Tuple2<>("tom", 24);
        Tuple2<String, Integer> shiny = new Tuple2<>("shiny", 22);
        DataSource<Tuple2<String, Integer>> broadcastData = env.fromElements(john, tom, shiny);
        // 新建一个dataset -> d1, 设置并行度为4
        // 此时 d1 是无法访问 broadcastData 的数据的, 因为两个dataset可能不在一个节点或者slot中, 所以 flink 是不允许去访问的
        DataSet<String> d1 = env.fromElements("john", "tom", "shiny").setParallelism(4);
        // 使用 RichMapFunction, 在open() 方法中拿到广播变量
        d1.map(new RichMapFunction<String, String>() {
            List<Tuple2<String, Integer>> bc;
            HashMap<String, Integer> map = new HashMap<>();
            @Override
            public void open(Configuration parameters) throws Exception {
                super.open(parameters);
                this.bc = getRuntimeContext().getBroadcastVariable("broadcastData");
                for (Tuple2<String, Integer> tp : bc) {
                    this.map.put(tp.f0, tp.f1);
                }
            }
            @Override
            public String map(String s) throws Exception {
                Integer age = this.map.get(s);
                return s + "->" + age;
            }
        }).withBroadcastSet(broadcastData, "broadcastData").print();
    }
}


相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
相关文章
|
存储 缓存 流计算
Flink / Scala- BroadCast 广播流数据先到再处理 Source 数据
Flink 支持增加 DataStream KeyBy 之后 conncet BroadCastStream 形成 BroadConnectedStream,广播流内数据一般为不间断更新的上下文信息,这里介绍如果等待广播流初始化完毕再处理 Source 数据
1808 0
Flink / Scala- BroadCast 广播流数据先到再处理 Source 数据
|
存储 搜索推荐 算法
Flink / Scala - DataStream Broadcast State 模式示例详解
一.引言 上一篇文章Flink / Scala - DataSet 应用 Broadcast Variables介绍了 DataSet 场景下 Broadcast 的使用,这一边
692 0
Flink / Scala - DataStream Broadcast State 模式示例详解
|
SQL Java Maven
【Flink】小白级入门,Flink sql 的基础用法(下)
【Flink】小白级入门,Flink sql 的基础用法
431 0
|
SQL Java 大数据
【Flink】小白级入门,Flink sql 的基础用法(上)
【Flink】小白级入门,Flink sql 的基础用法
676 0
|
BI API 流计算
Flink window 用法介绍(3)
Flink window 用法介绍(3)
208 0
Flink window 用法介绍(3)
|
流计算 索引 Windows
Flink window 用法介绍(2)
Flink window 用法介绍(2)
160 0
Flink window 用法介绍(2)
|
消息中间件 传感器 NoSQL
Flink window 用法介绍(1)
Flink window 用法介绍(1)
254 0
Flink window 用法介绍(1)
|
流计算
Flink用法介绍(2)
Flink用法介绍(2)
671 0
Flink用法介绍(2)
|
传感器 流计算
Flink用法介绍(1)
Flink用法介绍(1)
234 0
Flink用法介绍(1)
|
Java Scala 流计算
Flink用法介绍(3)
Flink用法介绍(3)
307 0

热门文章

最新文章