I.Flink中的 状态

目录

前言:

Flink中的状态


Flink是一个框架分布式处理引擎,用于对无边界有边界的数据流进行有状态的计算。

前言:

        实时计算如果任务失败导致中间状态丢失,将是一个可怕的事情,比如实时计算每天的pv,uv等指标,任务掉线之后中间状态也丢失了,那只能从凌晨数据重新计算。如果是有状态的计算大可不必担心,从任务掉线的时刻继续计算即可。

Flink中的状态

        按照数据的划分和扩张方式,Flink的状态分为2类:

        1.托管状态(Managed State)托管状态就是由Flink统一管理的,状态的存储访问、故障恢复和重组等一系列问题都由Flink实现,我们只要调接口就可以

        2.原生状态(Raw State)原始状态则是自定义的,相当于就是开辟了一块内存,需要我们自己管理,实现状态的序列化和故障恢复。

        在实际上的生产开发中基本会用到Managed State,不会用到Raw State,所以本章节的只介绍Managed State

 

 托管状态(Managed State)  

                Managed State分为两类:算子状态(Operator State)按键分区状态(Keyed State)。

        算子状态(Operator State):

       算子状态(Operator State)就是一个算子并行实例上定义的状态,作用范围被限定为当前算子任务。算子状态跟数据的key无关,所以不同key的数据只要被分发到同一个并行子任务,就会访问到同一个Operator State。    

        算子状态的实际应用场景不如Keyed State多,一般用在Source或Sink等与外部系统连接的算子上,或者完全没有key定义的场景。比如Flink的Kafka连接器中,就用到了算子状态。

        当算子的并行度发生变化时,算子状态也支持在并行的算子任务实例之间做重组分配。根据状态的类型不同,重组分配的方案也会不同。

     算子状态也支持不同的结构类型,主要有三种:ListState、UnionListState和BroadcastState。

                I.Flink中的 状态_第1张图片

        

        按键分区状态(Keyed State):     

        按键分区状态(Keyed State)顾名思义,是任务按照键(key)来访问和维护的状态。它的特点非常鲜明,就是以key为作用范围进行隔离

    需要注意,使用Keyed State必须基于KeyedStream。没有进行keyBy分区的DataStream,即使转换算子实现了对应的富函数类,也不能通过运行时上下文访问Keyed State。

     按键分区状态:值状态(ValueState)、列表状态(ListState)、Map状态(MapState)、归约状态(ReducingState)、聚合状态(AggregatingState)、状态生存时间(TTL)等

 I.Flink中的 状态_第2张图片

总结:

I.Flink中的 状态_第3张图片

 

你可能感兴趣的:(Flink,flink,大数据)