开发者社区> 问答> 正文

咨询一下 RocksDB 状态后端的调优经验

我们在 YARN 容器内运行以 RocksDB 作为 State Backend 的 Flink 作业,状态数据比较大(50G

以上,难以放到内存中)。但是由于 YARN 本身的 pmem-check 限制,经常会因为内存用量的不受控而导致整个 Container 被强制

KILL.

目前调研了 https://issues.apache.org/jira/browse/FLINK-7289 这个提议,但是目前还未完全实现。

也按照 RocksDB 官方的调优指南

https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide 设置了

state.backend.rocksdb.writebuffer.size

state.backend.rocksdb.writebuffer.count

state.backend.rocksdb.block.cache-size

state.backend.rocksdb.files.open

等等参数,但是目前观察到效果并不太明显,内存用量还是会不受控地越来越多。

请问各位是否有 RocksDB 作为状态后端的调优经验,例如在内存受限的情况下,尽量确保 RocksDB 的内存用量可控在一个封顶范围呢?

另外还有一个场景,假设内存够用的情况下,有哪些增加读写性能方面的建议呢?目前尝试使用 SSD 来存放 sst 文件,但是性能提升也不明显。

感谢 :)*来自志愿者整理的flink邮件归档

展开
收起
彗星halation 2021-12-02 18:17:37 632 0
1 条回答
写回答
取消 提交回答
  • RocksDB无论如何都是要使用native内存的,您的YARN pmem-check相比JVM heap的buffer空间是多少,是否合适呢?

    FLINK-7289的基本所需task都已经完成在release-1.10 分支中了,您可以直接使用release-1.10 分支打包,最近也要发布1.10的rc版本,欢迎试用该功能。

    如果你的所有checkpoint size是50GB,其实不是很大,但是如果单个state backend有50GB的话,对于Flink这种低延迟流式场景是稍大的,建议降低单并发state数据量。

    至于目前的问题,也就是您加了相关参数,但是内存用量仍然在涨,可以用以下思路排查一下:

    1. 首先,确保使用release-1.10 分支

    2. 开启 size-all-mem-tables [1] 和 block-cache-usage [2]的metrics监控

    3. 在默认没有enable "state.backend.rocksdb.memory.managed" [3] 的情况下,对column family进行如下配置,核心思路就是将主要的内存使用都放在cache中,方便观察内存使用:

    rocksDBStateBackend.setOptions(new OptionsFactory() {

    @Override

    public DBOptions createDBOptions(DBOptions currentOptions) {

    return currentOptions;

    }

    @Override

    public ColumnFamilyOptions createColumnOptions(ColumnFamilyOptions currentOptions) {

    BlockBasedTableConfig blockBasedTableConfig = new BlockBasedTableConfig();

    blockBasedTableConfig.setCacheIndexAndFilterBlocks(true);

    blockBasedTableConfig.pinL0FilterAndIndexBlocksInCache();

    currentOptions.setTableFormatConfig(blockBasedTableConfig);

    return currentOptions;

    }

    });

    1. 由于没有enable cache共享,所以需要将每个column family的size-all-mem-tables和block-cache-usage进行相加,观察相关指数变化,看是否超过了你的pmem-check 限制。

    相应地,您也可以启用"state.backend.rocksdb.memory.managed" [3] 该功能 或者 自行配置 "state.backend.rocksdb.memory.fixed-per-slot" [4] 设置期望的rocksDB per slot memory size,此时只需要观察block-cache-usage的指标,由于这里使用共享cache的逻辑,所以并不需要相加,只要观察per slot的情况即可(同一个TM内,相同subtask index的rocksDB state其实是用的同一块cache),观察内存限制功能是否生效。

    [1] https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/config.html#state-backend-rocksdb-metrics-size-all-mem-tables

    [2] https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/config.html#state-backend-rocksdb-metrics-block-cache-usage

    [3] https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/config.html#state-backend-rocksdb-memory-managed

    [4] https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/config.html#state-backend-rocksdb-memory-fixed-per-slot*来自志愿者整理的FLINK邮件归档

    2021-12-02 18:20:15
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
十分钟上线-使用函数计算构建支付宝小程序服务 立即下载
机器学习在互联网后端技术中的应用 立即下载
重新出发:阿里云数据库开源整体策略 立即下载