微博机器学习平台使用 Flink 实现多流 join 来生成在线机器学习须要的样本。时间窗口内的数据会被缓存到 state 里,且 state 访问的延迟一般决定了做业的性能。开源 Flink 的状态存储主要包括 RocksDB 和 Heap 两种,而在去年的 Flink Forward 大会上咱们了解到阿里云 VVP 产品自研了一款更高性能的状态存储插件 Gemini,并对其进行了测试和试用。apache
在本篇文章中咱们将对 RocksDB、Heap 和 Gemini 在相同场景下进行压测,并对其资源消耗进行对比。测试的 Flink 内核版本为 1.10.0。缓存
咱们使用真实的样本拼接业务做为测试场景,经过将多个流的数据union后对指定key作聚合(keyby),在聚合函数里从各个流中获取相应的字段,并将须要的字段从新组合成一个新的对象存储到 value state 里。这里对每一个新的对象都定义一个 timer,用 timer 功能来替代 TimeWindow,窗口结束时将数据发射到下游算子。使用 timer 功能的主要缘由是 timer 更灵活,更方便用户自定义,在平台的实用性,可扩展性上表现更好。框架
首先须要说明的是,MemoryStateBackend 不建议在线上使用,这里主要是经过测试量化一下使用 Heap 存储 state 的资源消耗。机器学习
咱们在测试中对 checkpoint 的配置以下:函数
CheckpointInterval:10分钟 CheckpointingMode: EXACTLY_ONCE CheckpointTimeout:3分钟
同时对 RocksDB 增长了以下配置:性能
setCompressionType:LZ4_COMPRESSION setTargetFileSizeBase:128 * 1024 * 1024 setMinWriteBufferNumberToMerge:3 setMaxWriteBufferNumber:4 setWriteBufferSize:1G setBlockCacheSize:10G setBlockSize:4 * 1024 setFilter:BloomFilter(10, false)
测试发现,相同做业处理相同的数据量时,使用 MemoryStateBackend 的做业吞吐和 RocksDB 相似(输入 qps 为 30 万,聚合后输出 qps 为 2 万),但所须要的内存(taskmanager.heap.mb)是 RocksDB 的 8 倍,对应的机器资源是 RocksDB 的 2 倍。学习
由此咱们得出如下结论:测试
能够经过以下方式,在 Ververica Platform 产品中指定使用 Gemini state backend:阿里云
state.backend=org.apache.flink.runtime.state.gemini.GeminiStateBackendFactory
同时咱们对 Gemini 进行了以下基础配置:spa
// 指定Gemini存储时的本地目录 kubernetes.taskmanager.replace-with-subdirs.conf-keys= state.backend.gemini.local.dir state.backend.gemini.local.dir=/mnt/disk3/state,/mnt/disk5/state // 指定Gemini的page压缩格式(page是Gemini存储的最小物理单元) state.backend.gemini.compression.in.page=Lz4 // 指定Gemini容许使用的内存占比 state.backend.gemini.heap.rate=0.7 // 指定Gemini的单个存储文件大小 state.backend.gemini.log.structure.file.size=134217728 // 指定Gemini的工做线程数 state.backend.gemini.region.thread.num=8
Note:全量的样本拼接负载使用 16 台机器没法彻底服务,所以咱们经过对数据进行不一样比例的抽样来进行压测。当出现反压时,咱们认为做业已经达到性能瓶颈。
由以上对比能够看出,在数据、做业处理逻辑、硬件配置等都相同的前提下,使用 Gemini 成功处理的数据量是 RocksDB 的 2.4 倍(17280 vs 7200 条/s)。同时经过硬件资源消耗的对比可知,RocksDB 更快达到磁盘 IO 瓶颈,而 Gemini 则具有更高的内存和 CPU 利用率。
做者简介:
曹富强、晨馨,微博机器学习研发中心-高级系统工程师。现负责微博机器学习平台数据计算/数据存储模块,主要涉及实时计算 Flink、Storm、Spark Streaming,数据存储Kafka、Redis,离线计算 Hive、Spark 等。目前专一于Flink/Kafka/Redis在微博机器学习场景的应用,为机器学习提供框架,技术,应用层面的支持。