【大数据】带你理解flink的state概念
文章目录
- 一、概述
- 1、简介
- 2、 State backend
- 2.1、MemoryStateBackend
- 2.2、FsStatebackend:
- 2.3、 RocksDBStateBackend
- 二、state的类型
- 1、原生状态(raw state)
- 2、托管状态(managed state)
- 3、两种形式
- 3.1 Operator State(算子状态)
- 3.2 keyed State(键控状态)
- 3.2.1、ValueState
- 3.2.2、ListState
- 3.2.3、MapState
- 3.2.4、ReducingState
- 3.2.5、AggregatingState
- 3.2.6、上述keyedState大体的使用方法
一、概述
1、简介
我们来看一下flink的介绍,
Apache Flink® — Stateful Computations over Data Streams,数据流上的状态计算。可以看出flink默认它是一个默认就有状态的分析引擎,State一般指一个具体的 Task/Operator 的状态,State数据默认保存在 Java 的堆内存中。
假设一个 Task 在处理过程中挂掉了,那么它在内存中的状态都会丢失,所有的数据都需要重新计算。从容错和消息处理的语义(At -least-once 和 Exactly-once)上来说,Flink引入了State 和 CheckPoint。
例如:WordCount 案例可以做到单词的数量的累加,其实是因为在内存中保证了每个单词的出现的次数,这些数据其实就是状态数据。
2、 State backend
现在你大概知道了state是什么,那么这些 state 存储的介质有哪些? Flink 提供了三种存储 State的介质。
2.1、MemoryStateBackend
使用方法:
MemoryStateBackend( int maxStateSize, boolean asynchronousSnapshots )
存储位置:
State: TaskManager 内存
Checkpoint: Jobmanager 内存
使用场景:
本地测试用,不推荐生产场景使用
2.2、FsStatebackend:
使用方法:
FaStateBackend( URI checkpointDataUri, boolean asynchronousSnapshots )
存储位置:
State:Taskmanager 内存
Checkpoint: 外部文件系统( 本地或 HDFS )
使用场景:
常规使用 State 的作业,可以在生产中使用
2.3、 RocksDBStateBackend
使用方法:
RocksDBStateBackend( URI checkpointDataUri, boolean enableIncrementalCheckpointing )
存储位置:
State: TaskManager 上的 KV 数据库(实际使用内存 + 磁盘)
Checkpoint: 外部文件系统(本地或 HDFS )
使用场景:
超大状态作业,对性能要求不高的生产场景
二、state的类型
Flink中有原生状态、托管状态两种基本类型的State,这两种类型的state都可以使用Operator State(算子状态)、keyed State(键控状态)这两种形式操作。
1、原生状态(raw state)
由用户操作算子自己管理数据结构,当触发Checkpoint操作过程中,Flink并不知道状态数据内部的数据结构,只是将数据转换成bytes数据存储在Checkpoints中,当从Checkpoints恢复任务时,算子自己再反序列化出状态的数据结构。
2、托管状态(managed state)
由Flink Runtime控制和管理状态数据,并将状态数据转换成为内存的Hash tables或 RocksDB的对象存储,然后将这些数据通过内部的接口持久化到checkpoints中,如果任务发生异常时,可以通过这些状态数据恢复任务。
下面是两种状态的比较表格,推荐使用ManagedState管理状态数据,ManagedState更好的支持状态数据的重平衡以及更加完善的内存管理
Managed State | Raw State | |
---|---|---|
状态管理方式 | Flink Runtime托管,自动存储、自动恢复、自动伸缩 | 用户自己管理 |
状态数据结构 | Flink提供的常用数据结构,如ListState、MapState等 | 字节数组:byte[] |
使用场景 | 绝大多数Flink算子 | 用户自定义算子 |
3、两种形式
3.1 Operator State(算子状态)
operator state是task级别的state,说白了就是每个task对应一个state。
Kafka Connector source中的每个分区(task)都需要记录消费的topic的partition和offset等信息。
对于Operator State,我们还需进一步实现CheckpointedFunction接口。
它经常被用在Source或Sink等算子上,用来保存流入数据的偏移量或对输出数据做缓存,以保证Flink应用的Exactly-Once语义。
3.2 keyed State(键控状态)
keyed State使用场景广泛,它是基于KeyedStream上的状态,这个状态是跟特定的Key 绑定的。KeyedStream流上的每一个Key,都对应一个State。Flink针对 Keyed State 提供了下面几种数据结构的(托管状态)Keyed state保存State。
3.2.1、ValueState
保存一个可以更新和检索的值(例如:每个值都对应到当前的输入数据的key,因此算子接收到的每个key都可能对应一个值)。 这个值可以通过update(T) 进行更新,通过 T value() 进行检索 。
3.2.2、ListState
保存一个元素的列表。可以往这个列表中追加数据,并在当前的列表上进行检索。可以通过 add(T) 或者 addAll(List) 进行添加元素,通过 Iterable get() 获得整个列表。还可以通过 update(List) 覆盖当前的列表 。
3.2.3、MapState
维护了一个映射列表。 你可以添加键值对到状态中,也可以获得 反映当前所有映射的迭代器。使用 put(UK,UV) 或者 putAll(Map<UK,UV>) 添加映射。 使用 get(UK) 检索特定 key。 使用 entries(),keys() 和 values() 分别检索映射、 键和值的可迭代视图。
3.2.4、ReducingState
保存一个单值,表示添加到状态的所有值的聚合。接口与ListState类似,但使用add(T) 增加元素,会使用提供的 ReduceFunction 进行聚合。
3.2.5、AggregatingState
AggregatingState<IN, OUT>: 保留一个单值,表示添加到状态的所有值的聚合。和 ReducingState 相反的是, 聚合类型可能与添加到状态的元素的类型不同。 接口与 ListState类似,但使用 add(IN) 添加的元素会用指定的 AggregateFunction 进行聚合
3.2.6、上述keyedState大体的使用方法
1、只能用于RichFunction
2、将State 声明为实例变量
3、在 open() 方法中为State赋值创建一个StateDescriptor利用getRuntimeContext().getXXState(…)构建不同的State
4、调用State的方法进行读写例如 state.value()、state.update(…)等等
【大数据】带你理解flink的state概念相关推荐
- Flink大数据实时计算系列-Flink的state介绍、Flink丰富的状态访问、Flink状态的分类
Flink大数据实时计算系列-Flink的state介绍.Flink丰富的状态访问.Flink状态的分类 目录 Flink的state介绍 Flink丰富的状态访问 Flink状态的分类 Flink参 ...
- Flink大数据实时计算系列-Flink Exactly Once及Flink的状态存储State Backend
Flink大数据实时计算系列-Flink Exactly Once及Flink的状态存储State Backend 目录 Flink的状态存储State Backend Flink参考链接 Flink ...
- Flink大数据实时计算系列-Flink的Operator State与Keyed State的Redistribute
Flink大数据实时计算系列-Flink的Operator State与Keyed State的Redistribute 目录 Flink的Operator State与Keyed State的Red ...
- Flink大数据实时计算系列-Flink的Keyed state的使用
Flink大数据实时计算系列-Flink的Keyed state的使用 目录 Flink 的Keyed state的使用 CountryCodeConnectKeyByKeyedState FileC ...
- 大数据计算引擎之Flink Flink CEP复杂事件编程
原文地址:大数据计算引擎之Flink Flink CEP复杂事件编程 复杂事件编程(CEP)是一种基于流处理的技术,将系统数据看作不同类型的事件,通过分析事件之间的关系,建立不同的时事件系序列库,并利 ...
- Flink大数据实时计算系列-Flink的checkpoint Flink的operatorState的CheckpointedFunction接口使用
Flink大数据实时计算系列-Flink的checkpoint Flink的operatorState的CheckpointedFunction接口使用 目录 Flink的checkpoint 代码实 ...
- 什么是大数据,怎么理解和应对大数据时代
什么是大数据,怎么理解和应对大数据时代 在大数据与深度学习中蝶化的人工智能.当代人工智能离不开大数据和深度学习算法.我们先来了解什么是大数据,大数据的本质是什么,在大数据时代我们应该如何应对? 当我们 ...
- python查看数据大小_科多大数据带你看Python可以列为最值得学习的编程语言
原标题:科多大数据带你看Python可以列为最值得学习的编程语言 不知道从什么时候开始,这句话开始流行.不过也从侧面反映出 Python 语言的特点:简单.高效. 从近期代表技术趋势的业界报告以及编程 ...
- 专栏:谈谈我对当下大数据整顿的理解与风控建议
FAL金科应用研究院 专栏:谈谈我对当下大数据整顿的理解与风控建议 最近大数据行业爬虫业务监管调查风波刚稍有平息,又有P2P行业疑是被传"全军覆没",国家年前的整治力度可不谓不大. ...
最新文章
- Linux的进程间通信-消息队列
- jQuery-点击按钮实现回到顶部的两种方式
- [转].NET下读取PDF文本
- 基于GDAL库,读取海洋风场数据(.nc格式)c++版
- ios和android交互差异,Android 和 iOS 主要交互区别整理
- python socket 大文件_python:socket传输大文件示例
- Android官方开发文档Training系列课程中文版:添加ActionBar之设置ActionBar
- iZotope RX 9 Advanced for Mac - 高级音频修复软件
- idea中本地git如何切换分支
- Linux时间子系统
- 【win10】装机必备推荐软件,提升你的计算机使用效率!
- 数据集(三)|人工智能领域100+数据集分享,赶紧收藏!
- 为了寻找当下最好的照片备份方式,我写了7000字的长文...
- vs2015安装+下载详细教程
- 幸运抽奖系统带后台源码
- 平行四边形(几何)题解
- 启用静态NVI的NAT的配置步骤及示例
- IE8中文正式版下载
- 最好PDF软件汇总070623
- 18 打印日期 华科复试