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

GitHub代码

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

状态编程和容错机制

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

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

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

在这里插入图片描述

Flink中的状态

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

在这里插入图片描述

算子状态(Operator State)

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

在这里插入图片描述

算子状态数据结构

在这里插入图片描述

键控状态(Keyed State)

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

在这里插入图片描述

键控状态数据结构

在这里插入图片描述

状态定义及使用

import java.lang

import com.atguigu.bean
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值