Flink 广播变量

作者: 架构师老狼 | 来源:发表于2021-07-09 10:55 被阅读0次

简介

  • 在Flink中,同一个算子可能存在若干个不同的并行实例,计算过程可能不在同一个Slot中进行,不同算子之间更是如此,因此不同算子的计算数据之间不能像Java数组之间一样互相访问,而广播变量Broadcast便是解决这种情况的。
  • 我们可以把广播变量理解为是一个公共的共享变量,我们可以把一个dataset 数据集广播出去,然后不同的task在节点上都能够获取到,这个数据在每个节点上只会存在一份

用法

1:初始化数据
  DataSet<Integer> num = env.fromElements(1, 2, 3)
  2:广播数据
  .withBroadcastSet(toBroadcast, "num");
  3:获取数据
  Collection<Integer> broadcastSet = getRuntimeContext().getBroadcastVariable("num");
  
  注意:
  1:广播出去的变量存在于每个节点的内存中,所以这个数据集不能太大。因为广播出去的数据,会常驻内存,除非程序执行结束
  2:广播变量在初始化广播出去以后不支持修改,这样才能保证每个节点的数据都是一致的
class BroadcastMap extends 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;
    }
}


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 BroadcastMap()).withBroadcastSet(broadcast, "number")
         // 2. 广播的broadcast
        .printToErr();//打印到err方便查看
    }
}

雷区

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

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

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

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

相关文章

  • flink 广播变量

    使用 注意 广播变量是只读状态 广播状态中事件的顺序在各个并发实例中可能不尽相同,因此不能依赖广播数据得顺序 所有...

  • Flink 广播变量

    简介 在Flink中,同一个算子可能存在若干个不同的并行实例,计算过程可能不在同一个Slot中进行,不同算子之间更...

  • flink广播变量案例

    有些实用性质了,书上的代码关联数据还没有下载下来,等下载下来再调试。 求取订单对应的商品,将订单和商品数据合并成一...

  • 9-Flink广播变量

    戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-Da...

  • 第一章 初识flink - flink命令的简单使用

    配置flink的环境变量 flink命令位于flink目录中的bin目录下, 经常使用的话可以把目录配置到环境变量...

  • [Flink BroadcastStream]Flink实战广播

    广播状态被引入以支持这样的用例:来自一个流的一些数据需要广播到所有下游任务,在那里它被本地存储,并用于处理另一个流...

  • 广播变量

    从 mysql 读取数据作为广播变量时, 虽然有 checkpoint 但是 kill 掉任务后,重启程序会失败。

  • 共享变量:广播变量

    一、使用场景如果我们要在分布式计算里面分发大对象(如:字典,集合,黑白名单等),由Driver端进行分发。如果这个...

  • Spark的广播变量机制

    Spark广播变量 什么是广播变量? 在同一个Execute共享同一份计算逻辑的变量 广播变量使用场景 我现在要在...

  • Spark之广播变量

    什么是广播变量 广播变量:分布式共享只读变量。广播变量用来高效分发较大的对象。向所有工作节点发送一个较大的只读值,...

网友评论

    本文标题:Flink 广播变量

    本文链接:https://www.haomeiwen.com/subject/wdqfpltx.html