一、Flink 常用问题及常用配置
参数 | 示例 | 说明 |
execution.checkpointing.interval | 3min | Checkpoint 触发间隔 |
state.backend | rocksdb / filesystem | 用于设置statebackend类型, 默认会以内存为statebackend(无法支持大状态) |
taskmanager.memory.jvm-overhead.max | 2048m | 如果使用rocksdb Statebackend可能会出现堆外内存超用导致container lost问题,配置此参数可避免出现该问题 |
taskmanager.memory.jvm-overhead.fraction | 0.2 | 默认是0.1 , 如果调整超过了1G,则需要调整taskmanager.memory.jvm-overhead.max, 增大max |
taskmanager.memory.managed.fraction | 0.5 | 设置managed memory的内存使用比例 |
taskmanager.memory.managed.size | 2048m | 设置managed memory的大小 |
state.backend.rocksdb.memory.partitioned-index-filters | true | 对RocksDB 的 partitioned Index 做了多级索引, 如果rocksdb的性能较差,可以尝试开启次参数进行优化 |
state.checkpoint.fs.ignore-missing-file | false | 当误删checkpoint导致作业无法启动时,通过设置该参数为true(默认false),使作业能够正常启动,仅在TM日志中记录一条异常(一般强烈建议不开启,可能会丢失状态,待出现该异常后再确定是否开启) |
state.backend.checkpoint.stream-concat-enabled | true | 开启状态文件合并,减少状态文件的数量. |
env.java.opts.jobmanager="" | 配置 jobManager jvm 参数 | |
env.java.opts.taskmanager="" | 配置 taskmanager jvm 参数 | |
pipeline.operator-chaining | true | 是否开启operator chain |
flink.log.level | info / debug | flink日志级别 |
二、另外,CGroup内存和taskmanager heap 内存的区别
区别总结:
特性 | TaskManager Heap Memory | CGroup Memory |
---|---|---|
定义 | Flink 配置项 taskmanager.heap.size 设置的 JVM 堆内存 | 操作系统(Linux)通过 CGroup 限制的 总内存 |
管理方式 | 由 JVM(Java) 内部的垃圾回收(GC)进行管理 | 由 Linux 内核 的 CGroup 进行管理 |
配置位置 | Flink 配置文件中的 taskmanager.heap.size | 通过操作系统或容器配置(如 Docker 的 --memory ) |
内存类型 | 仅限于 JVM 堆内存 | 包括 堆内存、非堆内存、网络缓冲区等 |
影响 | 影响 Flink 任务的内存分配和垃圾回收频率 | 控制整个 TaskManager 进程的内存使用限制 |
资源限制 | 只影响 JVM 堆内存,不包括非堆内存 | 限制 TaskManager 进程的所有内存消耗,包括堆内存、非堆内存和其他内存 |
超出限制时的处理 | 可能导致频繁的垃圾回收,影响性能 | 可能导致 OOM(Out of Memory)错误,TaskManager 崩溃 |
结论:
taskmanager.heap.size
主要影响 JVM 堆内存,它是 Flink 任务内存管理的一个核心部分。- CGroup 内存限制 是操作系统级别的限制,控制的是 TaskManager 进程的总体内存使用,包括堆内存、非堆内存以及其他类型的内存(例如网络缓冲区等)。CGroup 用于防止 TaskManager 因为内存使用过多而导致系统稳定性问题。
三、一般报错,报task manager was lost错误时:
task manager was lost只是现象,经常是内存OOM,container被kill掉了。具体是堆内内存不够还是堆外内存不够,需要具体看监控上的heap和cgroup内存监控,然后调整对应的内存资源分配。