apache-flink - Flink taskmanager内存不足及内存配置

标签 apache-flink flink-streaming

我们正在使用 Flink 流在单个集群上运行一些作业。我们的工作是使用 rocksDB 来保存状态。 集群配置为在 3 个独立的 VM 上使用单个 Jobmanager 和 3 个 Taskmanager 运行。 每个 TM 配置为使用 14GB RAM 运行。 JM 配置为以 1GB 运行。

我们遇到了 2 个与内存相关的问题: - 当使用 8GB 堆分配运行 Taskmanager 时,TM 耗尽了堆内存,我们得到了堆内存不足异常。我们解决这个问题的方法是将堆大小增加到 14GB。似乎这个配置解决了这个问题,因为我们不再因堆内存不足而崩溃。 - 尽管如此,在将堆大小增加到 14GB(每个 TM 进程)后,操作系统会耗尽内存并终止 TM 进程。 RES 内存随着时间的推移而增加,达到每个 TM 进程约 20GB。

<强>1。问题是我们如何预测物理内存的最大总量和堆大小配置?

<强>2。由于我们的内存问题,使用非默认值的 Flink 托管内存是否合理?在这种情况下,指导方针是什么?

更多细节: 每个 Vm 配置有 4 个 CPU 和 24GB RAM 使用 Flink 版本:1.3.2

最佳答案

所需的物理和堆内存总量很难计算,因为它在很大程度上取决于您的用户代码、作业的拓扑结构以及您使用的状态后端。

根据经验,如果您遇到 OOM 并且仍在使用 FileSystemStateBackendMemoryStateBackend,那么您应该切换到 RocksDBStateBackend ,因为如果状态变得太大,它可以优雅地溢出到磁盘。

如果您仍然遇到您所描述的 OOM 异常,那么您应该检查您的用户代码是否保留对状态对象的引用或以其他方式生成无法被垃圾回收的大对象。如果是这种情况,那么您应该尝试重构您的代码以依赖 Flink 的状态抽象,因为使用 RocksDB 它可以脱离核心。

RocksDB 本身需要原生内存,这会增加 Flink 的内存占用。这取决于 block 缓存大小、索引、布隆过滤器和内存表。您可以了解更多关于这些东西以及如何配置它们的信息 here .

最后但并非最不重要的一点是,在运行流作业时不应激活 taskmanager.memory.preallocate,因为流作业目前不使用托管内存。因此,通过激活预分配,您可以为 Flink 的托管内存分配内存,这会减少可用的堆空间。

关于apache-flink - Flink taskmanager内存不足及内存配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50812837/

相关文章:

java - 哪种方法是读取缓慢变化查找和丰富流输入集合的最佳方法?

Scala WindowFunction 无法编译

java - flink - 将值注入(inject) flatmap

java - Flink ParquetSinkWriter FileAlreadyExistsException

hadoop - Apache Flink AWS S3 Sink 是否需要 Hadoop 进行本地测试?

java - 弗林克 : Window evaluation

java - 无法运行 flink 示例程序,连接被拒绝

java - Flink 键控流键为空

apache-flink - 如何一起使用键值状态和检查点?

apache-flink - Flink Stream 窗口内存使用情况