Flink学习笔记——Flink State

Flink有两种基本类型的状态:托管状态(Managed State)原生状态(Raw State)。两者的区别:Managed State是由Flink管理的,Flink帮忙存储、恢复和优化,Raw State是开发者自己管理的,需要自己序列化。

 

Managed State

Raw State

状态管理方式  Flink Runtime托管, 自动存储, 自动恢复, 自动伸缩  用户自己管理

状态数据结构

 Flink提供多种常用数据结构, 例如:ListState, MapState  字节数组: byte[]

使用场景

 绝大数Flink算子  所有算子

ListState使用案例:使用flink实现一个topN的程序

Managed State又有两种类型:Keyed State和Operator State。

在Flink 中,Keyed State 是绑定到数据流中的特定键(Key)的。 这意味着Flink 维护了数据流中每一个key 的状态。 当处理一个新的元素时,Flink 会将状态的键设置为该元素的键,然后调用对应的处理函数。 Keyed State 的一个典型应用场景是计算每个键的滚动聚合。参考:Flink系列 13. 介绍Flink中的Operator State 和 Keyed State

Operator State可以被所有的operators使用。它通常适用于source,例如FlinkKafkaConsumer。每个operator状态都绑定到一个并行operator实例。Kafka consumer的每个并行实例都维护着一个topic分区和offset的映射,作为它的operator状态。官方文档:https://nightlies.apache.org/flink/flink-docs-release-1.17/docs/dev/datastream/fault-tolerance/state/#operator-state

 

Operator State

Keyed State

适用算子类型

 可用于所有算子: 常用于source, 例如 FlinkKafkaConsumer

只适用于KeyedStream上的算子

状态分配

一个算子的子任务对应一个状态

一个Key对应一个State: 一个算子会处理多个Key, 则访问相应的多个State

创建和访问方式

实现CheckpointedFunction或ListCheckpointed(已经过时)接口

重写RichFunction, 通过里面的RuntimeContext访问

横向扩展

并发改变时有多重重写分配方式可选: 均匀分配和合并后每个得到全量 并发改变, State随着Key在实例间迁移
支持的数据结构 ListState和BroadCastState  ValueState, ListState,MapState ReduceState, AggregatingState

参考:Apache Flink State Types【Flink】Flink 状态管理

 

 

参考:Apache Flink——状态编程

posted @ 2016-03-25 21:20  tonglin0325  阅读(252)  评论(0编辑  收藏  举报