Flink-状态编程和容错机制 | 算子状态和键控状态的介绍及数据结构 | 状态的定义及使用

GitHub代码

https://github.com/SmallScorpion/flink-tutorial.git

状态编程和容错机制

流式计算分为无状态和有状态两种情况。无状态的计算观察每个独立事件,并根据最后一个事件输出结果。例如,流处理应用程序从传感器接收温度读数,并在温度超过90度时发出警告。有状态的计算则会基于多个事件输出结果。以下是一些例子。

  1. 所有类型的窗口。例如,计算过去一小时的平均温度,就是有状态的计算。
  2. 所有用于复杂事件处理的状态机。例如,若在一分钟内收到两个相差20度以上的温度读数,则发出警告,这是有状态的计算。
  3. 流与流之间的所有关联操作,以及流与静态表或动态表之间的关联操作,都是有状态的计算。

下图展示了无状态流处理和有状态流处理的主要区别。无状态流处理分别接收每条数据记录(图中的黑条),然后根据最新输入的数据生成输出数据(白条)。有状态流处理会维护状态(根据每条输入记录进行更新),并基于最新输入的记录和当前的状态值生成输出记录(灰条)。

Flink-状态编程和容错机制 | 算子状态和键控状态的介绍及数据结构 | 状态的定义及使用_第1张图片

Flink中的状态

  1. 由一个任务维护,并且用来计算某个结果的所有数据,都属于这个任务的状态
  2. 可以认为状态就是一个本地变量,可以被任务的业务逻辑访问
  3. Flink 会进行状态管理,包括状态一致性、故障处理以及高效存储和访问,以便开发人员可以专注于应用程序的逻辑
  4. 在 Flink 中,状态始终与特定算子相关联
  5. 为了使运行时的 Flink 了解算子的状态,算子需要预先注册其状态

Flink-状态编程和容错机制 | 算子状态和键控状态的介绍及数据结构 | 状态的定义及使用_第2张图片

算子状态(Operator State)

  1. 算子状态的作用范围限定为算子任务,由同一并行任务所处理的所有数据都可以访问到相同的状态
  2. 状态对于同一子任务而言是共享的
  3. 算子状态不能由相同或不同算子的另一个子任务访问

Flink-状态编程和容错机制 | 算子状态和键控状态的介绍及数据结构 | 状态的定义及使用_第3张图片

算子状态数据结构

Flink-状态编程和容错机制 | 算子状态和键控状态的介绍及数据结构 | 状态的定义及使用_第4张图片

键控状态(Keyed State)

  1. 键控状态是根据输入数据流中定义的键(key)来维护和访问的
  2. Flink 为每个 key 维护一个状态实例,并将具有相同键的所有数据,都分区到同一个算子任务中,这个任务会维护和处理这个 key 对应的状态
  3. 当任务处理一条数据时,它会自动将状态的访问范围限定为当前数据的 key
  4. Keyed State很类似于一个分布式的key-value map数据结构,只能用于KeyedStream(keyBy算子处理之后)

Flink-状态编程和容错机制 | 算子状态和键控状态的介绍及数据结构 | 状态的定义及使用_第5张图片

键控状态数据结构

Flink-状态编程和容错机制 | 算子状态和键控状态的介绍及数据结构 | 状态的定义及使用_第6张图片

状态定义及使用

import java.lang

import com.atguigu.bean

你可能感兴趣的:(Flink模块化学习,flink,数据结构)