1 内存分配2 内存设置思路
2.1 配置举例2.2 配置思路
2.2.1 并行度,slot,taskmanager数量三者的关系2.2.2 资源大小选择
2.2.2.1 举例:2.2.2.1 计算过程
1 内存分配这里以flink1.12 的 flink webUI 来展示内存管理,后续版本的内存可能会有变更不一致的地方,详细的解释主要放在taskManager中
jvm metaspace存放jvm加载的类的元数据
还有一些想 Network 这种网络开销,一半不涉及修改的内存,没有标出来。
2 内存设置思路 2.1 配置举例内存数据结构:
flink最小内存分配单元 是内存段MemorySegment 默认32k。
在yarn提交名利中 可以对yarn进行配置来修改内存大小
如使用的是fs memory state,并且没有什么哈希排序操作,就可以修改managed Memory的大小,让更多的资源运用于task的堆上内存中
-yD taskmanager.memory.size=8192
-yD taskmanager.memory.fraction=0.3
-yD taskmanager.memory.managed.size=0.3
具体参数可以参考flink官网 :
https://nightlies.apache.org/flink/flink-docs-release-1.3/setup/config.html#managed-memory
简单点说 并行度>=slot*taskmanager ;
在 yarn 中提交一个 flink 任务, container 数量计算方式如下
container.num == taskmanager.num == ( parallelism.default / taskmanager.numberOfTaskSlots )
parallelism 是指 taskmanager 实际使用的并发能力。假设我们把 parallelism.default 设置
为 1,那么 9 个 TaskSlot 只能用 1 个,有 8 个空闲。 并发数<=slot*tm数 slot不够就会自动起tm,来补充
2.2.2 资源大小选择 2.2.2.1 举例:设置parallelism有多中方式,优先级为api>env>p>file
假设设置单个taskmanager为14g,taskmanager.memory.managed.fraction为0.5,将会得到以下内容:
JVM Heap Size:5.19 GB Flink Managed Memory:6.45 GB
JVM (Heap/Non-Heap) : Heap:5.19 GB Non-Heap:1.33 GB Total:6.52 GB
Outside JVM:Capacity:1.01GB
NetWork: count: xxxxx
可以计算得到6.45+6.52+1.01 = 13.98 等于14
2.2.2.1 计算过程taskmanager.memory.process.size 设置的是容器的内存大小。
计算过程在org.apache.flink.runtime.clusterframework.TaskExecutorProcessUtils中processSpecFromConfig方法,TaskExecutorProcessSpec类展示了1.10版本整个内存的组成。
计算方法分成3种:
- 指定了taskmanager.memory.task.heap.size和taskmanager.memory.managed.size 见方法:deriveProcessSpecWithExplicitTaskAndManagedMemory指定了taskmanager.memory.flink.size 见方法:deriveProcessSpecWithTotalFlinkMemory指定了taskmanager.memory.process.size(容器环境一般指定这个,决定全局容量)
totalProcessMemorySize = 设置的值 14g
jvmmetaspaceSize = taskmanager.memory.jvm-metaspace.size 默认96m
这个对应参数-XX:MaxmetaspaceSize=100663296。
jvmOverheadSize:
taskmanager.memory.jvm-overhead.min 192mtaskmanager.memory.jvm-overhead.max 1gtaskmanager.memory.jvm-overhead.fraction 0.1
公式 14g * 0.1 = 1.4g 必须在[192m, 1g]之间,所以jvmOverheadSize的大小是1g
totalFlinkMemorySize = 14g - 1g - 96m = 13216m
frameworkHeapMemorySize:taskmanager.memory.framework.heap.size 默认128m
frameworkOffHeapMemorySize:taskmanager.memory.framework.off-heap.size 默认128m
taskOffHeapMemorySize:taskmanager.memory.task.off-heap.size 默认0
确定好上面这些参数后,就是最重要的三个指标的计算了:taskHeapMemorySize,networkMemorySize,managedMemorySize
计算分成确定了:taskmanager.memory.task.heap.size还是没确定。
1)确定taskmanager.memory.task.heap.size
taskHeapMemorySize = 设置值
managedMemorySize = 设置了使用设置值,否则使用 0.4 * totalFlinkMemorySize
如果 taskHeapMemorySize + taskOffHeapMemorySize + frameworkHeapMemorySize + frameworkOffHeapMemorySize + managedMemorySize > totalFlinkMemorySize异常
networkMemorySize 等于剩余的大小,之后还会check这块内存是否充足,可以自己查看对应代码
2)未设置heap大小
先确定 managedMemorySize = 设置了使用设置值,否则使用 0.4 * totalFlinkMemorySize,这里就是 0.5 * 13216m = 6608 = 6.45g (这里就是dashboard的显示内容)
再确定network buffer大小,这个也是有两种情况,不细说。 [64mb, 1g] 0.1 * totalFlinkMemorySize = 1321.6, 所以是1g
最后剩余的就是taskHeapMemorySize,不能为负数,这里等于 13216 - 6608 - 1024 - 128 - 128 = 5328 = 5.2g (这里约等于dashboard的显示heap大小)
3)最后jvm的参数的计算过程:
jvmHeapSize = frameworkHeapSize + taskHeapSize = 5328 + 128 = 5456
jvmDirectSize = frameworkOffHeapMemorySize + taskOffHeapSize + networkMemSize = 128 + 1024 = 1152
jvmmetaspaceSize = 96m



