Flink——状态编程

流式计算分为 无状态 和 有状态 两种情况。

  无状态流处理:接收数据,根据最新输入数据生成输出数据

  有状态流处理:维护状态(根据每条输入记录进行更新),并基于最新输入的记录和当前的状态值生成输出记录

 

有状态的算子和应用程序:状态始终与特定算子关联,有两种类型状态

  算子状态(operator state):  

    作用范围限定为 算子任务。状态对同一任务而言是共享的,同一并行任务处理的所有数据都可以访问到相同的状态。算子状态不能由相同或不同算子的另一个任务访问。有三种基本数据结构:

    列表状态(List state):将状态表示为一组数据的列表

    联合列表状态(Union list state):与常规列表状态类似,发生故障时或保存点启动应用程序恢复方法不同

    广播状态(Broadcast state):适用一个算子有多个任务且任务状态相同。

  键控状态(keyed state):

    根据输入数据流中定义的键(key)来维护和访问。每个键值维护一个状态实例,并将相同键的所有数据分到同一个算子任务中,类似于一个分布式的 key-value-map 数据结构,相同的key的所有数据都会访问相同的状态,只能用于 KeyedStream。支持以下数据类型:

    ValueState<T>:保存单个值

      get操作:ValueState.value()

      set操作:ValueState.update(T value)

    ListState<T>:保存列表

      ListState.add(T value)

      ListState.addAll(List<T> values)

      ListState.get()

      ListState.update(List<T> values)

    MapState<K, V>:保存 key-value 对。

      MapState.get(UK key)

      MapState.put(UK key, UV value)

      MapState.contains(UK key)

      MapState,remove(UK key)

    ReducingState<T>

    AggregatingState<I, O>

    可以使用 clear 清空状态。

 

posted @ 2021-09-14 10:34  墨梅青莲  阅读(150)  评论(0)    收藏  举报