【问题标题】:Flink taskmanager out of memory and memory configurationFlink taskmanager out of memory 和内存配置
【发布时间】:2018-11-21 14:17:57
【问题描述】:

我们使用 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

【问题讨论】:

标签: apache-flink flink-streaming


【解决方案1】:

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

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

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

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

最后但同样重要的是,在运行流式作业时不应激活taskmanager.memory.preallocate,因为流式作业目前不使用托管内存。因此,通过激活预分配,您将为 Flink 的托管内存分配内存,从而减少可用的堆空间。

【讨论】:

  • 感谢您的快速回复。 “流作业当前不使用托管内存”是什么意思?据我们所见,运行我们的作业(严格使用流式 API)的 Flink 任务管理器确实有一个托管内存 - 数据端口 所有插槽 空闲插槽 CPU 核心 物理内存 JVM 堆大小 Flink 托管内存 60895 4 0 4 23.5 GB 14.0 GB 9.09 GB
  • 此外 - 1) 根据文档“对于流式设置......核心状态后端当前不使用托管内存。” - 除了核心状态后端,这个托管内存还有其他用途吗? 2)如果我们不使用托管内存(流式API),taskmanager.memory.fraction(默认0.7)的含义是什么?
  • Web UI 中显示的托管内存只是托管内存的最大限制。但这并不意味着 Flink 为托管内存分配了这么多内存。使用流式 API 时,不会使用托管内存。它仅供 Flink 的批处理操作符使用。 taskmanager.memory.fraction 定义了托管内存的上限,以防使用托管内存。对于流媒体程序,此值无效,因为它们不分配托管内存页面。
  • @TillRohrmann 我使用 Flink 1.9 和 S3 作为状态后端存储,但仍然看到 TM 出现 OOM。自从这个线程开始以来已经 2 年了,我们仍然必须使用 RocksDB 作为状态后端来处理长时间运行的流式作业吗?
  • @UmeshK,如果您遇到 OOM 并且正在使用 HeapStateBackend,那么您可以尝试可溢出的堆状态后端 flink-packages.org/packages/spillable-state-backend-for-flink。如果这不起作用,那么我建议使用RocksDBStateBackend
【解决方案2】:

使用 RocksDBStateBackend 可能会导致大量堆外/直接内存消耗,直至主机上的可用内存。通常这不会导致问题,因为任务管理器进程是唯一的大内存消耗者。但是,如果有其他进程动态更改内存分配,则可能导致内存不足。我遇到了这篇文章,因为我正在寻找一种方法来限制 RocksDBStateBackend 内存使用量。从 Flink 1.5 开始,有可用的替代选项集here。看来这些只能以编程方式激活,而不是通过flink-conf.yaml

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    相关资源
    最近更新 更多