文章目录

  • 一、概述
    • 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概念相关推荐

  1. Flink大数据实时计算系列-Flink的state介绍、Flink丰富的状态访问、Flink状态的分类

    Flink大数据实时计算系列-Flink的state介绍.Flink丰富的状态访问.Flink状态的分类 目录 Flink的state介绍 Flink丰富的状态访问 Flink状态的分类 Flink参 ...

  2. Flink大数据实时计算系列-Flink Exactly Once及Flink的状态存储State Backend

    Flink大数据实时计算系列-Flink Exactly Once及Flink的状态存储State Backend 目录 Flink的状态存储State Backend Flink参考链接 Flink ...

  3. Flink大数据实时计算系列-Flink的Operator State与Keyed State的Redistribute

    Flink大数据实时计算系列-Flink的Operator State与Keyed State的Redistribute 目录 Flink的Operator State与Keyed State的Red ...

  4. Flink大数据实时计算系列-Flink的Keyed state的使用

    Flink大数据实时计算系列-Flink的Keyed state的使用 目录 Flink 的Keyed state的使用 CountryCodeConnectKeyByKeyedState FileC ...

  5. 大数据计算引擎之Flink Flink CEP复杂事件编程

    原文地址:大数据计算引擎之Flink Flink CEP复杂事件编程 复杂事件编程(CEP)是一种基于流处理的技术,将系统数据看作不同类型的事件,通过分析事件之间的关系,建立不同的时事件系序列库,并利 ...

  6. Flink大数据实时计算系列-Flink的checkpoint Flink的operatorState的CheckpointedFunction接口使用

    Flink大数据实时计算系列-Flink的checkpoint Flink的operatorState的CheckpointedFunction接口使用 目录 Flink的checkpoint 代码实 ...

  7. 什么是大数据,怎么理解和应对大数据时代

    什么是大数据,怎么理解和应对大数据时代 在大数据与深度学习中蝶化的人工智能.当代人工智能离不开大数据和深度学习算法.我们先来了解什么是大数据,大数据的本质是什么,在大数据时代我们应该如何应对? 当我们 ...

  8. python查看数据大小_科多大数据带你看Python可以列为最值得学习的编程语言

    原标题:科多大数据带你看Python可以列为最值得学习的编程语言 不知道从什么时候开始,这句话开始流行.不过也从侧面反映出 Python 语言的特点:简单.高效. 从近期代表技术趋势的业界报告以及编程 ...

  9. 专栏:谈谈我对当下大数据整顿的理解与风控建议

    FAL金科应用研究院 专栏:谈谈我对当下大数据整顿的理解与风控建议 最近大数据行业爬虫业务监管调查风波刚稍有平息,又有P2P行业疑是被传"全军覆没",国家年前的整治力度可不谓不大. ...

最新文章

  1. Linux的进程间通信-消息队列
  2. jQuery-点击按钮实现回到顶部的两种方式
  3. [转].NET下读取PDF文本
  4. 基于GDAL库,读取海洋风场数据(.nc格式)c++版
  5. ios和android交互差异,Android 和 iOS 主要交互区别整理
  6. python socket 大文件_python:socket传输大文件示例
  7. Android官方开发文档Training系列课程中文版:添加ActionBar之设置ActionBar
  8. iZotope RX 9 Advanced for Mac - 高级音频修复软件
  9. idea中本地git如何切换分支
  10. Linux时间子系统
  11. 【win10】装机必备推荐软件,提升你的计算机使用效率!
  12. 数据集(三)|人工智能领域100+数据集分享,赶紧收藏!
  13. 为了寻找当下最好的照片备份方式,我写了7000字的长文...
  14. vs2015安装+下载详细教程
  15. 幸运抽奖系统带后台源码
  16. 平行四边形(几何)题解
  17. 启用静态NVI的NAT的配置步骤及示例
  18. IE8中文正式版下载
  19. 最好PDF软件汇总070623
  20. 18 打印日期 华科复试

热门文章

  1. mipi屏参参数配置
  2. 与活体检测技术结合的人脸识别技术
  3. 《激荡三十年》——来了解我们的时代
  4. laravel 使用workerman加速应用
  5. 数论作业 —— 公约数公倍数问题
  6. PyTorch开发者福音, OpenVINO整合PyTorch实现推理加速!
  7. 一文搞懂ROS2的spin_some, spin和ROS的spinOnce
  8. 【区块链技术与应用】(五)
  9. 插件分享 | 简单免杀绕过和利用上线的 GoCS
  10. Redis主从配置,简单滴很