在当今数据驱动的时代,如何高效且稳定地处理持续增长的数据流成为技术领域的一大挑战。Apache Flink凭借其卓越的流处理能力,特别是针对长时间运行任务设计的精细内存管理和状态处理机制,在应对这一挑战中提供了强有力的支持。然而,不当的配置可能导致资源浪费,因此深入探讨Flink内存治理的策略显得尤为重要。
内存模型※
TM内存※
- 框架堆内存(Framework Heap Memory) 用于 Flink 框架的 JVM 堆内存,默认128M
- 框架堆外内存(Framework Off-heap Memory)用于 Flink 框架的堆外内存 ,默认128M
- 任务堆内存(Task Heap Memory) 用于 Flink 应用的算子及用户代码的 JVM 堆内存,默认为none,由Flink内存扣除其他部分内存所得
- 任务堆外内存(Task Off-heap Memory)用于 Flink 应用的算子及用户代码的堆外内存,默认为0,表示不使用堆外内存
- 托管内存(Managed memory) 由 Flink 管理的用于排序、哈希表、缓存中间结果及 RocksDB State Backend 的本地内存。默认40%
- 网络内存(Network Memory)用于任务之间数据传输的直接内存(例如网络传输缓冲)。默认10%
- JVM 元空间(JVM Metaspace) Flink JVM 进程的 Metaspace。默认256M
JVM 执行开销(JVM Overhead)用于其他 JVM 开销的本地内存,例如栈空间、垃圾回收空间等。默认10%,默认最大1G
JM内存※
- JVM 元空间(JVM Metaspace) Flink JVM 进程的 Metaspace。默认256M
- JVM 执行开销(JVM Overhead)用于其他 JVM 开销的本地内存,例如栈空间、垃圾回收空间等。默认10%,默认最大1G
- JVM堆内存(JVM Heap) JobManager 的 JVM 堆内存。
- JVM堆外内存(JVM Off-heap Memory)JobManager 的堆外内存(直接内存或本地内存)。
指标数据采集※
基于原生的PrometheusPushGateway二次开发 将数据上报至thanos。主要是解决以下几个问题
- 精简架构,不引入过多的组件
- Pushgateway的单机问题(可以通过前置ELB等组件缓解)
- Pushgateway性能问题,不适合高频大数据量场景
诊断规则※
通过查询thanos中的指标数据,分析任务运行情况,重点关注CPU/内存/数据量/GC等指标,下面将介绍俩个对内存治理比较明显的俩个规则
托管内存治理※
通过监控flink_taskmanager_Status_Flink_Memory_Managed_Used指标数据,分析任务对托管内存的需求
手动指定taskmanager.memory.managed.size参数来治理默认参数导致的内存浪费情况
网络内存治理※
通过监控flink_taskmanager_Status_Shuffle_Netty_UsedMemory指标数据,分析任务对网络内存的需求
手动指定taskmanager.memory.network.max参数来治理默认参数导致的内存浪费情况需注意最大值不能小于最小值
这俩块内存区域,默认占比高 不合理的设置将造成大量的内存浪费
扩展※
基于此架构还可以收集业务指标,用于实时数据质量
参考资料