Flink 状态管理

版权声明:本文为博主原创文章,转载请留下脚印,技术交流评论。 https://blog.csdn.net/ZLZ2017/article/details/86033534

什么是状态(State)

  有些任务的结果不仅仅依赖于当前的输入,也依赖于之前的输入结果信息,因此对中间结果状态等的保存就很有必要。
  在Flink中,我们可以这样理解State:某task/operator在某时刻的一个中间结果。

状态类型

  Flink提供了丰富的状态访问接口和高效的容错机制,当前Flink中有两个基本的state:Keyed state和 Operator state。

1. Keyed state是基于KeyedStream上的状态,这个状态与特定的key绑定。对于KeyedStream流上每一个key都对应一个state(一个Task可能包含多个Key,不同的Task上不会出现相同的Key)。
当前Flink提供的Keyed state数据结构是: ValueState<T>、ListState<T>、ReduceState<T>、MapState<T>。
2. Operator state跟一个特定的Operator的一个并发实例绑定,一个task对应一个state。
当前Flink提供的Operator state数据结构是: ListState<T>
  举例来说,Flink中的Kafka Connector,就使用了operator state。它会在每个connector实例中,保存该实例中消费topic的所有(partition, offset)映射。

Keyed state

Operator state

原始状态和Flink托管状态 (Raw and Managed State)

  Keyed State和Operator State,可以以两种形式存在:原始状态和托管状态。
  托管状态是由Flink框架管理的状态,如ValueState, ListState, MapState等。

Flink状态框架的类图
  而raw state即原始状态,由用户自行管理状态具体的数据结构,框架在做checkpoint的时候,使用byte[]来读写状态内容,对其内部数据结构一无所知。通常在DataStream上的状态推荐使用托管的状态,当实现一个用户自定义的operator时,会使用到原始状态。

Checkpoint

  Checkpoint是Flink管理状态容错的手段,检查点允许Flink恢复流中的状态及位置,从而是应用程序正确无误的运行。默认情况下,禁用检查点,状态保存在TaskManager的内存中,检查点存储在JobManager内存中。
  Checkpoint是Flink中轻量级的分布式异步快照的机制。Flink流式计算模型中包含Source Operator、Transformation Operators、Sink Operator等三种不同类型的节点,分别负责数据的输入、处理、和输出,对应计算拓扑的起点、中间节点和终点。Flink分布式快照的核心是Barrier,这些Barrier周期性的被注入到数据流并作为数据流的一部分流入到到所有的Source中,Source节点看到Barrier后,会立即记录自己的状态,然后将Barrier发送到Transformation Operator;当Transformation Operator从某个input channel收到Barrier后,它会立刻Block住这条通道,直到所有的input channel都收到Barrier,此时该Operator就会记录自身状态,并向自己的所有output channel广播Barrier。Sink接受Barrier的操作流程与Transformation Oper一样。当所有的Barrier都到达Sink之后,并且所有的Sink也完成了Checkpoint,这一轮Snapshot就完成了。
  Block Input实际上是有负面效果的,一旦某个input channel发生延迟,Barrier迟迟未到,这会导致Transformation Operator上的其它通道全部堵塞,系统吞吐大幅下降。但是这么做的一个最大的好处就是能够实现Exactly Once。不过Flink还是提供了选项,可以关闭Exactly once并仅保留at least once,以提供最大限度的吞吐能力。

猜你喜欢

转载自blog.csdn.net/ZLZ2017/article/details/86033534