Flink1.12-之内存管理
1、前言
flink为了让用户更好的调整内存分配,达到资源的合理分配,在Fllink1.10引入了TaskManager的内存管理,后续在Flink1.11版本引入了JobManager的内存管理,用户可以通过配置的方式合理的分配资源。
不管是TaskManager还是JobManager都是单独的JVM进程,他们共用一套内存模型抽象(TaskManager的内存模型更加复杂),如下。

该模型由heap和off-heap内存组成,这里有以下3种调整内存的方式,3种方式必须选一种,不然会启动失败,最好不要同时指定2种方式,否则有可能会产生配置冲突。
| for TaskManager: | for JobManager: |
|---|---|
taskmanager.memory.flink.size |
jobmanager.memory.flink.size |
taskmanager.memory.process.size |
jobmanager.memory.process.size |
taskmanager.memory.task.heap.size and taskmanager.memory.managed.size |
jobmanager.memory.heap.size |
-
直接调整
jobmanager.memory.process.size或者taskmanager.memory.process.size的方式- 该方式是最简单的方式,该配置下的所有的组件的内存分配都会有默认值,或者通过推导得到,通常在yarn或者k8s、mesos的时候这样指定,container部署通过该参数的配置来申请容器的大小。
-
直接调整
jobmanager.memory.flink.size或者taskmanager.memory.flink.size的方式- 这种方式通常在standalone的时候使用的比较多,其它组件的
-
第三种是直接配置heap和off-heap组件的大小,达到更细粒度的控制,或者配合前2种方式中的其中之一使用也是可以的。
以上三种方式任选一种~!!
2、JobManager内存分配
JobManager的内存模型如下.

以上total process size的模型图可以分为以下的4个内存组件,如果在分配内存的时候,显示的指定了组件其中的1个或者多个,那么JVM overhead的值就是在其它组件确定的情况下,用total process size - 其它 获取的值,必须在min~max之间,如果没有指定组件的值,那么就按照0.1的fraction进行计算得到,如果计算出的值小于min取min,如果大于max取max,如果min、max指定的相等,那么这个JVM overhead就是一个确定的值!
| 内存组件 | 配置选项 | 内存组件的功能 |
|---|---|---|
| JVM Heap | jobmanager.memory.heap.size | 这个大小取决于提交的作业个数和作业的结构以及用户代码的要求。=>>>> 主要用来运行flink框架,执行作业提交时的用户代码以及checkpoint的回调代码 |
| Off-heap Memory | jobmanager.memory.off-heap.size(默认128M) | JM的对外内存的大小. 涵盖了所有direct和native的内存分配。=>>>>用来执行akka等外部依赖,同时也负责运行checkpoint回调及作业提交时的用户代码 |
| JVM metaspace | jobmanager.memory.jvm-metaspace.size(默认256M) | JM的元空间大小,有默认值jobmanager.memory.jvm-metaspace.size = 256M, 属于native memory |
| JVM Overhead | jobmanager.memory.jvm-overhead.min (192M)jobmanager.memory.jvm-overhead.max (1G)jobmanager.memory.jvm-overhead.fraction(0.1) | 为thread stacks, code cache, garbage collection space预留的native memory,有默认的faction of total process size,但是必须在其min & max之间 |
2.1、分配 total process size
jobmanager.memory.process.size


# 此时我们只显示指定了 jobmanager.memory.process.size 的值,没有指定其它组件,此时整个JobManager的JVM进程能占用的内存为2000M
0、total process size = 2000M(这是分配的基准值)
1、JVM overhead 因为没有指定其它组件内存,所以被按照0.1的fraction推断成 => 2000M * 0.1 * 1024 * 1024 = 209715203B(200M)
2、JVM Metaspace 默认值为 256M
3、Off-Heap Memeory 默认为 128M
4、JVM Heap最终被推断为 2000M - 200M - 256M - 128M = 1.38G(?????????????)
√ 为啥JVM Heap只有1.33GB而不是1.38GB呢?

其实这个取决于你使用的GC算法会占用其中很小一部分固定内存作为Non-heap,该占用部分大小为:1.38-1.33 = 0.05GB。
2.2、分配 total flink size
jobmanager.memory.flink.size


本文详细介绍了Flink 1.12版本中JobManager和TaskManager的内存管理机制,包括不同配置选项如何影响内存分配,以及在不同部署场景下如何合理配置内存。

4240

被折叠的 条评论
为什么被折叠?



