我有一个flink作业(scala),基本上是从kafka-topic(1.0)读取的,聚合数据(1分钟的事件时间滚动窗口,使用fold函数,我知道它已被弃用,但比聚合更容易实现)函数),然后将结果写入2个不同的kafka主题。
问题是-当我使用FS状态后端时,一切运行顺利,检查点耗时1-2秒,平均状态大小为200 mb-也就是说,直到状态大小增加为止(在缩小差距的同时,例如)。
我以为我会尝试使用rocksdb(通过hdfs)作为检查点,但是吞吐量明显小于fs状态后端。据我了解,使用fs状态后端时,flink不需要为每个状态访问进行ser /反序列化,因为状态保存在内存(堆)中,会运行db DOES,我想这就是造成速度下降的原因(和背压,检查点需要更长的时间,有时10分钟后会超时)。
不过,有时候状态无法容纳在内存中,我试图从根本上弄清楚如何使rocksdb状态后端执行“更好”的操作。
是因为不赞成使用折叠功能吗?我是否需要微调一些在文档中不容易搜索到的参数?有小费吗?
最佳答案
每个状态后端将工作状态保存在某个地方,然后将其检查点持久地保存在分布式文件系统中。 RocksDB状态后端将其工作状态保存在磁盘上,并且可以是本地磁盘,希望比hdfs更快。
尝试将state.backend.rocksdb.localdir(请参见https://ci.apache.org/projects/flink/flink-docs-release-1.6/ops/state/state_backends.html#rocksdb-state-backend-config-options)设置为每个任务管理器上最快的本地文件系统上的某个位置。
启用增量检查点也可能有很大的不同。
另请参见Tuning RocksDB。
关于hdfs - Flink RocksDB性能问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53250108/