适用模块

实时计算

具体说明

Flink配置参数说明

使用示例

TaskManager 内存配置:

taskmanager.memory.process.size:该参数设置 TaskManager 进程可以使用的总内存,包括 JVM 堆内存、用于托管内存的堆外内存以及网络缓冲区的内存。

taskmanager.memory.managed.size:该参数设置用于托管内存的内存量。托管内存用于 Flink 的操作符,并由 Flink 的内存管理器管理。它是独立于 JVM 堆内存的,旨在减少垃圾回收开销。

taskmanager.memory.managed.fraction:该参数确定 Flink 用于托管内存的内存比例。这是另一种配置托管内存的方式,将其指定为 TaskManager 可用总内存的一部分。

taskmanager.memory.network.fraction:该参数配置用于网络缓冲区的内存比例。网络缓冲区用于在 TaskManager 之间传输数据。

taskmanager.memory.framework.off-heap.size:该参数设置用于托管内存的堆外内存大小。当托管内存分配在堆外时使用。

taskmanager.memory.managed.off-heap: 用于指示是否将托管内存分配到堆外内存。

taskmanager.memory.task.off-heap: 用于设置任务堆外内存的大小。

taskmanager.memory.jvm-overhead.max: 用于设置 JVM 内存使用的最大额外开销。

JobManager 内存配置

jobmanager.heap.size:该参数设置 Flink JobManager 的堆大小。它确定为 JobManager 的 JVM 分配的堆内存量。

常见问题

(具体参考flink官方文档https://nightlies.apache.org/flink/flink-docs-master/zh/docs/deployment/memory/mem_setup/)

IllegalConfigurationException

如果遇到从 TaskExecutorProcessUtils 或 JobManagerProcessUtils 抛出的 IllegalConfigurationException 异常,这通常说明您的配置参数中存在无效值(例如内存大小为负数、占比大于 1 等)或者配置冲突。 请根据异常信息,确认出错的内存部分的相关文档及配置信息。

OutOfMemoryError: Java heap space

该异常说明 JVM 的堆空间过小。 可以通过增大总内存、TaskManager 的任务堆内存、JobManager 的 JVM 堆内存等方法来增大 JVM 堆空间。 提示 也可以增大 TaskManager 的框架堆内存。 这是一个进阶配置,只有在确认是 Flink 框架自身需要更多内存时才应该去调整。

OutOfMemoryError: Direct buffer memory

该异常通常说明 JVM 的直接内存限制过小,或者存在直接内存泄漏(Direct Memory Leak)。 请确认用户代码及外部依赖中是否使用了 JVM 直接内存,以及如果使用了直接内存,是否配置了足够的内存空间。 可以通过调整堆外内存来增大直接内存限制。 有关堆外内存的配置方法,请参考 TaskManager、JobManager 以及 JVM 参数的相关文档。

OutOfMemoryError: Metaspace

该异常说明 JVM Metaspace 限制过小。 可以尝试调整 TaskManager、JobManager 的 JVM Metaspace。

IOException: Insufficient number of network buffers

该异常仅与 TaskManager 相关。 该异常通常说明网络内存过小。 可以通过调整以下配置参数增大网络内存: taskmanager.memory.network.min taskmanager.memory.network.max taskmanager.memory.network.fraction

容器(Container)内存超用

如果 Flink 容器尝试分配超过其申请大小的内存(Yarn 或 Kubernetes),这通常说明 Flink 没有预留出足够的本地内存。 可以通过外部监控系统或者容器被部署环境杀掉时的错误信息判断是否存在容器内存超用。 对于 JobManager 进程,你还可以尝试启用 JVM 直接内存限制(jobmanager.memory.enable-jvm-direct-memory-limit),以排除 JVM 直接内存泄漏的可能性。 If RocksDBStateBackend is used: and memory controlling is disabled: You can try to increase the TaskManager’s managed memory and memory controlling is enabled and non-heap memory increases during savepoint or full checkpoints: This may happen due to the glibc glibc bug environment variable MALLOC_ARENA_MAX=1 此外,还可以尝试增大 JVM 开销。

作者:J