我们正在运行一个 Flink 集群来计算历史 TB 级的流数据。数据计算具有巨大的状态,我们使用键控状态 - RocksDb 后端的值和映射状态。在作业计算的某个时刻,作业性能开始下降,输入和输出速率下降到几乎为零。此时,日志中可以看到"与任务管理器 X 通信超时错误"等异常,但是作业甚至在之前就遭到了破坏。
我认为我们面临的问题与RocksDb的磁盘后端有关。随着作业状态的增长,它需要更频繁地访问磁盘,这会将性能拖到 0。我们已经使用了一些选项,并设置了一些对我们的特定设置有意义的选项:
我们正在使用SPINNING_DISK_OPTIMIZED_HIGH_MEM
预定义的配置文件,通过optimizeFiltersForHits
和其他一些选项进一步优化,这在一定程度上提高了性能。但是,这不能提供稳定的计算,并且在针对更大的数据集重新运行作业时,作业会再次停止。
我们正在寻找一种修改作业的方法,以便即使输入和状态增加,它也能以一定的速度进行。我们在 AWS 上运行,任务管理器的限制设置为 15 GB 左右,磁盘空间没有限制。
使用 SPINNING_DISK_OPTIMIZED_HIGH_MEM 会通过 RocksDB 的内存表消耗巨大的堆外内存,看到您正在运行内存限制约为 15GB 的作业,我认为您会遇到 OOM 问题,但如果您选择默认的预定义配置文件,您将通过解压缩 Rocksdb 的页面缓存来面临写入停顿问题或 CPU 开销, 所以我认为你应该增加内存限制。 以下是一些关于Rocksdb FYI的帖子: https://github.com/facebook/rocksdb/wiki/Memory-usage-in-RocksDB https://www.ververica.com/blog/manage-rocksdb-memory-size-apache-flink