menu Spark社区 | 一条苦行狗的家
search
close
Flink 广播变量和累加变量
121 浏览 | 9 评论

Flink Broadcast(广播变量)

  • 广播变量允许编程人员在每台机器上保持1个只读的缓存变量,而不是传送变量的副本个tasks
  • 广播变量创建后,它可以运行在集群中的任何function上,而不需要多次传递给集群节点。另外需要注意,不应该修改广播变量,这样才能确保每个节点获取到的值都是一致的。
  • 广播变量可以理解为一个公共的共享变量,可以把一个dataset数据集广播出去,然后不同的task在节点上都能获取到,这个数据在每个节点上只会存在一份。如果不使用broadcast,则在每个节点中的每个task中都需要拷贝一份dataset数据集,比较浪费内存(也就是一个节点中可能会存在多分dataset数据)

用法

  1. 初始化数据

DataSet<Integer> toBroadcast = env.fromElements(1,2,3)

  1. 广播数据

.withBroadcastSet(toBoardcast,"broadcastSetName")

  1. 获取数据

Collection<Integer> broadcastSet = getRuntimeContext().getBroadcastVariable("broadcastSetName")

注意:

  1. 广播出去的变量存在于每个节点的内存中,所以这个数据集不能太大。因为广播出去的数据,会常驻内存,除非程序执行结束。
  2. 广播变量在初始化广播出去以后不支持修改,这样才能保证每个节点的数据都是一致的。

累加变量 Accumulators

  • Accumulator即累加器,与Mapreduce counter的应用场景差不多,都能很好地观察task在运行期间的数据变化。
  • 可以在Flink job任务中的算子函数中操作累加器,但是只能在任务执行结束之后才能获得累加器的最终结果。
  • Counter是一个具体的累加器(Accumulator)实现

    • IntCounter,LongCounter和DoubleCounter

用法

  1. 创建累加器

private IntCounter numLines = new IntCounter()

  1. 注册累加器

getRuntimeContext().addAccumulator("num-lines",this.numLines)

  1. 使用累加器

this.numLines.add(1)

  1. 获取累加器的结果

myJobExecutionResult.getAccumulatorResult("num-lines")

Flink Broadcast和Accumulators的区别

  • Broadcast(广播变量)允许程序员将一个只读的变量缓存在每台机器上,而不用在任务之间传递变量。广播变量可以进行共享,但是不可以进行修改。
  • Accumulators(累加器)是可以在不同任务中对同一变量进行累加操作。

评论

textsms
支持Markdown语法
email
link

mode_comment 全部评论 已有 9 条评论 (o゜▽゜)o☆
  1. 2019年10月15日 12:10

    我也喜欢这个评论框

  2. zzz
    2019年09月28日 18:20

    哇,这个评论模块不错呀,不需要注册,只需要留一个邮箱和昵称就能评论,那如果博主回复我的话,我对应邮箱是会收到回复通知是这样的么?

    1. zzz
      2019年09月28日 18:54

      test reply

      1. 2019年09月29日 23:25

        这个我还没关注过

        1. zzz
          2019年10月01日 14:16

          我看了一下我留下的邮箱里的邮件,没有相关邮件,不得劲儿啊

  3. zzz
    2019年09月28日 18:18

    test comment

  4. 於季
    2019年09月22日 20:36

    主题挺好看的,能发一份吗? ∠( ᐛ 」∠)_

  5. 2019年09月07日 19:45

    广播变量是只读的吗?

  • 1
  • 2