本文描述了一些配置选项,这些选项将帮助您有效地管理规划 Apache Flink 中 RocksDB state backend 的内存大小。在前面的文章[1]中,我们描述了 Flink 中支持的可选 state backend 选项,本文将介绍跟 Flink 相关的一些 RocksDB 操作,并讨论一些提高资源利用率的重要配置。

Tips:从 Flink 1.10 开始,Flink 自动管理 RocksDB 的内存,详细介绍如下:

https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/state/state_backends.html#memory-management

RocksDB 的状态后端

在深入了解配置参数之前,先回顾一下在 Apache Flink 中如何使用 RocksDB 来进行状态管理。当选择 RocksDB 作为状态后端时,状态将作为序列化字节串存在于堆外内存(off-heap) 存储或本地磁盘中。

RocksDB 是一个以日志合并树( LSM 树)作为索引结构的 KV 存储引擎。当用于在 Flink 中存储 kv 状态时,键由 的序列化字节串组成,而值由状态的序列化字节组成。每次注册 kv 状态时,它都会映射到列族(column-family)(类似于传统数据库中的表),并将键值对以字节串存储在 RocksDB 中。这意味着每次读写(READ or WRITE)操作都必须对数据进行反序列化或者序列化,与 Flink 内置的 in-memory 状态后端相比,会有一些性能开销。

使用 RocksDB 作为状态后端有许多优点:

  • 不受 Java 垃圾回收的影响,与 heap 对象相比,它的内存开销更低,并且是目前唯一支持增量检查点(incremental checkpointing)的选项。
  • 使用 RocksDB,状态大小仅受限于本地可用的磁盘空间大小,这很适合 state 特别大的 Flink 作业。

下面的图表将进一步阐明 RocksDB 的基本读写操作。

RocksDB 的一次写入操作将把数据写入到内存的 MemTable 中。当 MemTable 写满时,它将成为 READ ONLY MemTable,并被一个新申请的 MemTable 替换。只读 MemTable 被后台线程周期性地刷新到磁盘中,生成按键排序的只读文件,这便是所谓的 SSTables。这些 SSTable 是不可变的,通过后台的多路归并实现进一步的整合。如前所述,对于 RocksDB,每个注册状态都是一个列族,这意味着每个状态都包含自己的 MemTables 和 SSTables 集。

RocksDB 中的读取操作首先访问活动内存表(Active Memory Table)来反馈查询。如果找到待查询的 key,则读取操作将由新到旧依次访问,直到找到待查询的 key 为止。如果在任何 MemTable 中都找不到目标 key,那么 READ 操作将访问 SSTables,再次从最新的开始。SSTables 文件可以:

  1. 优先去 RocksDB 的 BlockCache 读取;
  2. 如果 BlockCache 没有的话,就去读操作系统的文件,这些文件块又可能被操作系统缓存了;
  3. 最差的情况就是去本地磁盘读取;
  4. SST 级别的 bloom filter 策略可以避免大量的磁盘访问。

## 管理 RocksDB 内存的 3 种配置

现在,我们理解了 Flink 和 Rocksdb 的协作机制,接下来看看可以更有效地管理 RocksDB 内存大小的配置选项有哪些?请注意,下面的选项并不详尽,因为您可以使用 Apache Flink 1.6 中引入的 state TTL(Time To Live)功能来规划 Flink 应用程序的状态大小。

以下三种配置可以有效帮助您管理 Rocksdb 的内存开销:

1.block_cache_size 的配置

此配置最终将控制内存中缓存的最大未压缩块数。随着块数的不断增加,内存大小也会增加。因此,通过预先配置,您可以保持固定的内存消耗水平。

2.write_buffer_size 的配置

这种配置控制着 RocksDB 中 MemTable 的最大值。活跃 MemTables 和只读的 MemTables 最终会影响 RocksDB 中的内存大小,所以提前调整可能会在以后为您避免一些麻烦。

3.max_write_buffer_number 的配置

在 RocksDB 将 MemTables 导出到磁盘上的 SSTable 之前,此配置决定并控制着内存中保留的 MemTables 的最大数量。这实际上是内存中“只读内存表“的最大数量。

除了上面提到的资源之外,您还可以选择配置索引和 bloom 过滤器,它们将消耗额外的内存空间, Table 级别的 Cache 也是一样。

在这里,Table 缓存不仅会额外占用 RocksDB 的内存,还会占用 SST 文件的打开文件描述符,(在默认情况下设置的大小是不受限制的),如果配置不正确,可能会影响操作系统的设置。

我们刚刚给您指导了一些使用配置选项,这些配置有助于高效管理 RocksDB 作为 Flink statebackend 的内存大小。有关更多配置选项,我们建议查看 RocksDB 优化指南[2]或 Apache Flink 文档。

参考资料:

[1] https://www.ververica.com/blog/stateful-stream-processing-apache-flink-state-backends
[2] https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide

原文链接
本文为云栖社区原创内容,未经允许不得转载。

如何在 Flink 中规划 RocksDB 内存容量?相关推荐

  1. c++ 进程快照_如何在 Linux 中找出内存消耗最大的进程

    很多次,你可能遇见过系统消耗了过多的内存.如果是这种情况,那么最好的办法是识别出 Linux 机器上消耗过多内存的进程. -- Magesh Maruthamuthu(作者) 很多次,你可能遇见过系统 ...

  2. 60-008-026-使用-命令-如何在flink中传递参数

    1.视界 2.概述 众所周知,flink作为流计算引擎,处理源源不断的数据是其本意,但是在处理数据的过程中,往往可能需要一些参数的传递,那么有哪些方法进行参数的传递?在什么时候使用?这里尝试进行简单的 ...

  3. 如何在 Linux 中找出内存消耗最大的进程

    很多次,你可能遇见过系统消耗了过多的内存.如果是这种情况,那么最好的办法是识别出 Linux 机器上消耗过多内存的进程.我相信,你可能已经运行了下文中的命令以进行检查.如果没有,那你尝试过哪些其他的命 ...

  4. 如何在Linux中清除交换内存

    交换内存通常是一种"设置好后遗忘"的事情.大多数企业环境已在系统中内置了交换功能,并且除非明显存在可用内存不足或者由于OOM杀手(内存不足)错误导致服务器崩溃,否则不会操纵这些内存 ...

  5. android 获取应用内存大小,如何在Android中获取当前内存使用量?

    这取决于您要获得的内存查询的定义. 通常,您想知道堆内存的状态,因为如果它占用了太多内存,您就会得到OOM并使应用程序崩溃. 为此,您可以检查下一个值:final Runtime runtime =  ...

  6. STM32程序占用的内存容量计算

    STM32中程序占用内存容量 Keil MDK下Code, RO-data,RW-data,ZI-data这几个段: Code存储程序代码. RO-data存储const常量和指令. RW-data存 ...

  7. 使用jemalloc在Go中进行手动内存管理

    目录 通过Cgo创建内存 jemalloc 在字节片上放置Go结构 用分配器摊销Calloc的成本 明智地参考 处理分配的GB 排序可变长度数据 捕捉内存泄漏 结论 推荐阅读 曼尼斯·赖·贾 因(Ma ...

  8. 如何进行内存容量测试?

    随着计算机发展的不断推进,内存容量对于计算机的运行速度和效率变得更为重要.而在实际使用中,我们需要确定计算机内存的真正容量,从而更好地掌握系统性能和运行状态.本文将详细介绍如何进行内存容量测试. 一. ...

  9. 如何在 Apache Flink 中使用 Python API?

    本文根据 Apache Flink 系列直播课程整理而成,由 Apache Flink PMC,阿里巴巴高级技术专家 孙金城 分享.重点为大家介绍 Flink Python API 的现状及未来规划, ...

最新文章

  1. Centos5.5完整安装Cacti+Spine
  2. arduino Pro Mini和nano​替代芯片LGT8F328P,上传报错Cannot run program解决方法
  3. Redis进阶 -CLUSTER NODES 信息结合实际输出信息解读
  4. Android设计模式——单例模式(Singleton)
  5. 奉献一个窗口置顶的小工具
  6. bash error 环境变量错误
  7. DOM 事件深入浅出(一)
  8. 详解OpenCV中的cvCreateMat()函数
  9. 第 8章 面向对象补充和网络编程
  10. mysql 报500错误_java 项目开启mysql binlog参数后报500错误:
  11. uni-app APP横屏和竖屏
  12. java 农历公历转换_JAVA版农历和阳历相互转换源码
  13. Twitter开发者账号申请流程
  14. vim End Home失效
  15. 目标2025:通信产业在能源变局中拥抱智能未来
  16. python农历_用python计算农历/阴历假日
  17. 5G时代下的室内定位技术--精准室内定位--新导智能
  18. 太空垃圾回收-7自由度机器人MATLAB仿真
  19. iOS 集成聚宝云支付
  20. iOS 面向切面编程 Aspects 库的使用

热门文章

  1. pythonwx功能_python中wx模块的具体使用方法
  2. java字符转为数字_Java 判断字符串能否转化为数字的三种方法
  3. python装饰器的通俗理解_python装饰器的通俗理解
  4. python将文本文件加密后输出_Python:将Casear密码和柱状转置密码的加密输出写入.txt文件...
  5. c语言中把各位上为奇数的数取出,下列给定程序中函数fun()的功能是:将长整型数中每一位上为奇数的数依次取出,构成一个新数放在冲。 - 赏学吧...
  6. html 文本溢出,确定HTML元素的内容是否溢出
  7. 识别波峰波谷算法_马丁普林格:波峰-波谷演进法
  8. 中科院院士:最让人讨厌的10种研究生导师
  9. 三十而已,工程师如何做好职业成长?
  10. 湖南打工妹逆袭成为身价5亿“网络第一红娘”