王海鱼 发表于 2025-3-31 05:31:57

Flink内存模型--flink1.19.1

Flink 的 JobManager 和 TaskManager 在内存分配上有差别的职责和布局。以下是两者的内存分类及详细说明:
一、JobManager 内存分类

JobManager 主要负责作业调度、协调(如 Checkpoint 协调)、资源管理等,其内存需求相对较低,主要分为以下几个部分:
https://i-blog.csdnimg.cn/direct/6b7ec1750ac040138049143f79fe53c7.png
1. JVM 堆内存(JVM Heap)



[*]用途:

[*]存储作业的元数据(如 JobGraph、ExecutionGraph)。
[*]管理 Checkpoint 协调信息(如 Checkpoint 触发逻辑)。
[*]处置惩罚客户端提交作业的请求(如 REST API 交互)。

[*]设置参数:

[*]jobmanager.memory.heap.size:直接指定堆大小(如 2048m)。
[*]jobmanager.memory.heap.fraction:按比例分配(需结合总内存设置)。

2. JVM 元空间(Metaspace)



[*]用途:存储 JVM 加载的类元数据(Class Metadata)。
[*]设置参数:

[*]jobmanager.memory.jvm-metaspace.size:默认约 256m,可通过 -XX:MaxMetaspaceSize 调解。

3. JVM 直接内存(Direct Memory)



[*]用途:用于 Netty 网络通信的堆外内存(如 JobManager 与 TaskManager 间的心跳通信)。
[*]设置参数:

[*]jobmanager.memory.off-heap.size:默认较小(如 128m),一样平常无需调解。

4. JVM 开销(JVM Overhead)



[*]用途:为 JVM 自身预留的内存(如线程栈、本地方法调用)。
[*]设置参数:

[*]jobmanager.memory.jvm-overhead.min/max/fraction:通常占总内存的 10%。

5. 总内存公式

Total JobManager Memory =
Heap + Metaspace + Direct Memory + JVM Overhead + 其他(如 Native 库)
二、TaskManager 内存分类

TaskManager 是数据盘算的核心组件,其内存布局更为复杂,主要分为以下部分:
https://i-blog.csdnimg.cn/direct/70dabf2ec38d43dab720631c95116f1b.png
1. 框架堆内存(Framework Heap)



[*]用途:运行 Flink 框架本身的代码(如 Task 调度、Shuffle 管理)。
[*]设置参数:

[*]taskmanager.memory.framework.heap.size:默认 128m,一样平常无需调解。

2. 任务堆内存(Task Heap)



[*]用途:用户代码(如 Map、Filter 算子)的堆内存,存储用户创建的对象。
[*]设置参数:

[*]taskmanager.memory.task.heap.size:直接指定大小。
[*]taskmanager.memory.task.heap.fraction:按比例分配(默认 0.4)。

3. 托管内存(Managed Memory)



[*]用途:Flink 自动管理的内存,用于批处置惩罚排序/哈希、RocksDB 状态后端、PyFlink 等(详见之前的总结)。
[*]设置参数:

[*]taskmanager.memory.managed.size 或 taskmanager.memory.managed.fraction(默认 0.4)。

4. 网络缓冲区(Network Buffers)



[*]用途:TaskManager 间数据传输的缓冲区(如 Shuffle、Broadcast)。
[*]设置参数:

[*]taskmanager.memory.network.min/max/fraction:默认占总内存的 0.1。
[*]每个 Buffer 大小:taskmanager.memory.segment-size(默认 32KB)。

5. JVM 元空间(Metaspace)



[*]设置参数:

[*]taskmanager.memory.jvm-metaspace.size:默认 256m。

6. JVM 直接内存(Direct Memory)



[*]用途:用于堆外数据(如 RocksDB 直接访问内存、Netty 网络传输)。
[*]设置参数:

[*]taskmanager.memory.off-heap.size:默认不启用,需显式设置。

7. JVM 开销(JVM Overhead)



[*]设置参数:

[*]taskmanager.memory.jvm-overhead.min/max/fraction:默认占总内存的 0.1。

8. 总内存公式

Total TaskManager Memory =
Framework Heap + Task Heap + Managed Memory + Network Buffers +
Metaspace + Direct Memory + JVM Overhead + 其他(如 Native 库)
三、设置示例与调优建议

1. JobManager 设置示例

jobmamager.memory.process.size: 8192m   # 总内存
jobmanager.memory.heap.size: 4096m      # 堆内存 4GB
jobmanager.memory.jvm-metaspace.size: 512m# 元空间 512MB
jobmanager.memory.jvm-overhead.max: 1024m   # JVM 开销上限 1GB
2. TaskManager 设置示例

taskmamager.memory.process.size = 10240m    # tm总内存
taskmanager.memory.task.heap.size: 4096m    # 任务堆内存 4GB
taskmanager.memory.managed.size: 8192m      # 托管内存 8GB(用于批处理或 RocksDB)
taskmanager.memory.network.fraction: 0.2    # 网络缓冲区占比 20%
taskmanager.memory.jvm-metaspace.size: 512m # 元空间 512MB
3. 调优建议



[*]JobManager:

[*]小规模作业:堆内存 2~4GB 充足。
[*]大规模作业(如千个 Task):需增大堆内存(如 8GB+)以处置惩罚更多元数据。

[*]TaskManager:

[*]批处置惩罚作业:增大托管内存(占比 50%~70%)减少磁盘溢出。
[*]流处置惩罚作业(利用 RocksDB):确保托管内存充足容纳 Block Cache(至少 1GB)。
[*]高吞吐场景:增长网络缓冲区大小或占比,避免背压。
[*]避免 OOM:

[*]若用户代码占用堆内存过多,增大 taskmanager.memory.task.heap.size。
[*]若元空间不敷,调解 -XX:MaxMetaspaceSize。


四、常见题目排查


[*] JobManager OOM:

[*]现象:作业提交失败或频繁 Full GC。
[*]办理:增大 jobmanager.memory.heap.size,查抄元数据规模(如超大状态)。

[*] TaskManager OOM:

[*]Task Heap OOM:用户代码天生过多对象 → 增大任务堆内存。
[*]Managed Memory OOM:批处置惩罚溢出频繁或 RocksDB 缓存不敷 → 增大托管内存。
[*]Metaspace OOM:类加载过多 → 调解 -XX:MaxMetaspaceSize。

[*] 网络瓶颈:

[*]现象:反压(Backpressure)或低吞吐。
[*]办理:增大 taskmanager.memory.network.fraction 或 taskmanager.memory.segment-size。

五、总结



[*]JobManager:轻量级协调者,内存需求集中在堆和元空间。
[*]TaskManager:核心盘算节点,需平衡任务堆内存、托管内存和网络缓冲区。
[*]调优核心:根据作业范例(批/流)、状态后端(Heap/RocksDB)和集群规模动态调解。建议通过 Flink Web UI 监控内存利用率,逐步优化设置。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Flink内存模型--flink1.19.1