原文链接: 一文了解Flink State Backends

当我们使用Flink进行流式计算时,通常会产生各种形式的中间结果,我们称之为State。有状态产生,就必然涉及到状态的存储,那么Flink中定义了哪些形式的状态存储呢,下面一一给大家介绍一下。

State Backends

  • MemoryStateBackend
  • FsStateBackend
  • RocksDBStateBackend

MemoryStateBackend

顾名思义,MemoryStateBackend状态后端是将状态数据以Object的形式存放于Java Heap中。

当执行检查点时,MemoryStateBackend会为当前的状态生成snapshot,然后将快照信息作为检查点ack消息的一部分发送给JobManager(master节点),JobManager会将收到的快照数据存放于自己的堆内存中。

MemoryStateBackend默认采用异步snapshots的方式来避免数据流管道阻塞,这是一种比较推荐的方式。当然,我们也可以通过配置来禁用这种方式。

new MemoryStateBackend(MAX_MEM_STATE_SIZE, false); // MAX_MEM_STATE_SIZE表示最大允许的状态容量

MemoryStateBackend的使用限制

  • 每个状态的大小默认限制为5MB,可以通过构造函数设置状态大小
  • 不管如何配置最大状态大小,都不能超过akka帧大小
  • 聚合状态大小必须合乎JobManager的内存大小

基于以上这些限制,我们通常建议在如下场景中使用MemoryStateBackend:

  • 本地开发调试
  • 无状态作业或者保存少量状态的作业

此外,官方建议将托管内存(Managed Memory)设置为0,这样可以确保为JVM上的用户程序分配最大的内存。

FsStateBackend

FsStateBackend需要配置一个文件系统URL,如:“hdfs://namenode:40010/flink/checkpoints” or “file:///data/flink/checkpoints”。

FsStateBackend将作业执行过程中的动态数据存放在TaskManager的内存当中,当执行检查点时,状态快照数据会被存储在配置的文件系统目录中,还有一部分metadata数据会被存储在JobManager的内存当中。

同样的,FsStateBackend也是默认采用异步snapshot的方式。我们可以通过实例化FsStateBackend来更改快照生成方式。

 new FsStateBackend(path, false);

官方建议在以下场景中使用FsStateBackend:

  • 作业中包含大状态、长窗口以及大键值状态
  • 高可用应用场景

同样官方建议将托管内存(Managed Memory)设置为0,这样可以确保为JVM上的用户程序分配最大的内存。

RocksDBStateBackend

RocksDBStateBackend同样需要配置一个文件系统URL:“hdfs://namenode:40010/flink/checkpoints” or “file:///data/flink/checkpoints”。

RocksDBStateBackend将作业执行过程中的动态数据存放在RocksDB数据库中,RocksDB数据库默认存储在TaskManager的数据目录下。当执行检查点时,整个RocksDB数据库会被存档到配置的文件系统目录下。只有少量的metadata数据存储在JobManager的内存当中。

同样地,RocksDBStateBackend通常也采用异步snapshot的方式。

使用上的一些限制:

  • 由于RocksDB的JNI bridge API是基于byte[]的,因此可支持的最大key值大小是2^31 byte。这个限制一般情况下不会有问题,但当作业中的状态是基于不断地merge操作生成时,很容易超过这个大小限制,这个时候就会出现检索失败的错误。

官方建议在以下场景中使用RocksDBStateBackend:

  • 作业中包含大状态、长窗口以及大键值状态
  • 高可用应用场景

乍一看,好像跟FsStateBackend没啥区别?其实不是,这里需要注意的是,当我们使用RocksDBStateBackend作为状态存储时,可以维护的状态大小仅仅受限于程序可访问的磁盘空间大小。这就使得我们可以维护比FsStateBackend更大的作业状态。

当然,这也带来一个问题:由于与状态后端之间的所有读写操作都要经过de-/serialization,因此这种方式牺牲了一定的吞吐量。

总结

  • MemoryStateBackend、FsStateBackend都是基于堆的状态存储
  • RocksDBStateBackend是目前唯一的一种支持增量checkpoint的状态后端

欢迎关注我的微信公众号:【高高木】。第一时间阅读最新经验分享,一起交流成长。

一文了解Flink State Backends的更多相关文章

  1. Flink State Backends (状态后端)

    State Backends 的作用 有状态的流计算是Flink的一大特点,状态本质上是数据,数据是需要维护的,例如数据库就是维护数据的一种解决方案.State Backends 的作用就是用来维护S ...

  2. Flink State 有可能代替数据库吗?

    有状态的计算作为容错以及数据一致性的保证,是当今实时计算必不可少的特性之一,流行的实时计算引擎包括 Google Dataflow.Flink.Spark (Structure) Streaming. ...

  3. Flink之状态之状态存储 state backends

    流计算中可能有各种方式来保存状态: 窗口操作 使用 了KV操作的函数 继承了CheckpointedFunction的函数 当开始做checkpointing的时候,状态会被持久化到checkpoin ...

  4. Flink - state管理

    在Flink – Checkpoint 没有描述了整个checkpoint的流程,但是对于如何生成snapshot和恢复snapshot的过程,并没有详细描述,这里补充   StreamOperato ...

  5. Flink - state

      public class StreamTaskState implements Serializable, Closeable { private static final long serial ...

  6. Flink State Rescale性能优化

    背景 今天我们来聊一聊flink中状态rescale的性能优化.我们知道flink是一个支持带状态计算的引擎,其中的状态分为了operator state和 keyed state两类.简而言之ope ...

  7. Flink State的两张图

    streamTask的invoke方法中,会循环去调用task上的每个operator的initializeState方法,在这个方法中,会真正创建除了savepointStream的其他三个对象, ...

  8. Flink - Working with State

    All transformations in Flink may look like functions (in the functional processing terminology), but ...

  9. 一文带你彻底了解大数据处理引擎Flink内存管理

    摘要: Flink是jvm之上的大数据处理引擎. Flink是jvm之上的大数据处理引擎,jvm存在java对象存储密度低.full gc时消耗性能,gc存在stw的问题,同时omm时会影响稳定性.同 ...

随机推荐

  1. 4、Redis基础

    redis性能 1.关于测试性能 官方自带的测试性能的工具 redis-benchmark 压力测试工具 #进行压力测试.需求:测试:100个并发连接,100000个请求 #redis-benchma ...

  2. gogs报错解决合集

    目录 一.在组织中添加成员,一直显示普通用户 一.在组织中添加成员,一直显示普通用户 组织是公司,团队是公司中的不同队伍.例如A团队设置为加入就有管理员权限,那加入就有管理员. 但在组织成员那一栏中加 ...

  3. Gitlab-CICD实践篇

    一.背景 随着公司项目使用gitlab越来越多,业务发布的次数越来越频繁,对于发布效率提出了更高的要求.从2012开始,Gitlab官方开始集成了Continuous Integration (CI) ...

  4. 丈量你的代码,从cloc开始

    如果我想统计我当前的项目有多少代码量?行数最高的代码文件有哪些?并且排除某些目录,怎么统计?要统计出注释多少行,和代码多少行?使用cloc就行. cloc是一款使用Perl语言开发的开源代码统计工具, ...

  5. ansible自定义模块

    参考官网:http://www.ansible.com.cn/docs/developing_modules.html#tutorial 阅读 ansible 附带的模块(上面链接)是学习如何编写模块 ...

  6. .NET 云原生架构师训练营(建立系统观)--学习笔记

    目录 目标 ASP .NET Core 什么是系统 什么是系统思维 系统分解 什么是复杂系统 作业 目标 通过整体定义去认识系统 通过分解去简化对系统的认识 ASP .NET Core ASP .NE ...

  7. CF637B Chat Order 题解

    Content 有 \(n\) 个字符串,每次出现这个单词就把这个单词放到队列的队首(若已经出现就把原队列里面的那个单词提到队首),求最后的队列由队首到队尾的元素依次是多少. 数据范围:\(1\leq ...

  8. CF1065A Vasya and Chocolate 题解

    Content 小 V 有 \(s\) 块钱,商店里有巧克力卖,每块巧克力 \(c\) 块钱,现在商店给出优惠:购买 \(a\) 块巧克力可以免费获得 \(b\) 块巧克力,求小 V 最多能够买到的巧 ...

  9. 搭建 3D 智慧农场可视化,解锁绿色生态田园

    前言 何为"无人农场"?中国工程院院士罗锡文用五句话高度概括:"耕种管收生产环节全覆盖:机库田间转移作业全自动:自动避障异况停车保安全:作物生产过程实施全监控:智能决策精 ...

  10. Python sys模块 os模块、OS.open() | open() | OS._exit() | sys.exit() | exit()

    sys模块:负责程序和Python交互. sys常用方法:===========================  sys.stdout.write('please:')val = sys.stdin ...