flink sql

Flink RocksDB状态后端参数调优实践

2020-08-26  本文已影响0人  LittleMagic

Foreword

截至当前,Flink作业的状态后端仍然只有Memory、FileSystem和RocksDB三种可选,且RocksDB是状态数据量较大(GB到TB级别)时的唯一选择。RocksDB的性能发挥非常仰赖调优,如果全部采用默认配置,读写性能有可能会很差。但是,RocksDB的配置也是极为复杂的,可调整的参数多达百个,没有放之四海而皆准的优化方案。如果仅考虑Flink状态存储这一方面,我们仍然可以总结出一些相对普适的优化思路。本文先介绍一些基础知识,再列举方法。

Note:本文的内容是基于我们在线上运行的Flink 1.9版本实践得出的。在1.10版本及以后,由于TaskManager内存模型重构(传送门),RocksDB内存默认成为了堆外托管内存的一部分,可以免去一些手动调整的麻烦。如果性能仍然不佳,需要干预,则必须将state.backend.rocksdb.memory.managed参数设为false来禁用RocksDB内存托管。

State R/W on RocksDB

RocksDB作为Flink状态后端时的读写逻辑与一般情况略有不同,如下图所示。

Flink作业中的每一个注册的状态都对应一个列族(column family),即包含自己独立的memtable和sstable集合。写操作会先将数据写入活动memtable,写满之后则会转换为不可变memtable,并flush到磁盘中形成sstable。读操作则会依次在活动memtable、不可变memtable、block cache和sstable中寻找目标数据。另外,sstable也需要通过compaction策略进行合并,最终形成分层的LSM Tree存储结构,老生常谈了。

特别地,由于Flink在每个检查点周期都会将RocksDB的数据快照持久化到文件系统,所以自然也就不需要再写预写日志(WAL)了,可以安全地关闭WAL与fsync。

之前笔者已经详细讲解过RocksDB的compaction策略(传送门),并且提到了读放大、写放大和空间放大的概念,对RocksDB的调优本质上就是在这三个因子之间取得平衡。而在Flink作业这种注重实时性的场合,则要重点考虑读放大和写放大。

Tuning MemTable

memtable作为LSM Tree体系里的读写缓存,对写性能有较大的影响。以下是一些值得注意的参数。为方便对比,下文都会将RocksDB的原始参数名与Flink配置中的参数名一并列出,用竖线分割。

Tuning Block/Block Cache

block是sstable的基本存储单位。block cache则扮演读缓存的角色,采用LRU算法存储最近使用的block,对读性能有较大的影响。

Tuning Compaction

compaction在所有基于LSM Tree的存储引擎中都是开销最大的操作,弄不好的话会非常容易阻塞读写。建议看官先读读前面那篇关于RocksDB的compaction策略的文章,获取一些背景知识,这里不再赘述。

Generic Parameters

The End

除了上述设置参数的方法之外,用户还可以通过实现ConfigurableRocksDBOptionsFactory接口,创建DBOptions和ColumnFamilyOptions实例来传入自定义参数,更加灵活一些。看官可参考Flink预先定义好的几个RocksDB参数集(位于PredefinedOptions枚举中)获取更多信息。

写得有点乱了,民那晚安晚安。

上一篇 下一篇

猜你喜欢

热点阅读