栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

flink内存管理与资源大小设置思路,并行度,slot,taskmanager数量三者的数量关系

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

flink内存管理与资源大小设置思路,并行度,slot,taskmanager数量三者的数量关系

这里写目录标题

1 内存分配2 内存设置思路

2.1 配置举例2.2 配置思路

2.2.1 并行度,slot,taskmanager数量三者的关系2.2.2 资源大小选择

2.2.2.1 举例:2.2.2.1 计算过程

这里以flink1.12 的 flink webUI 来展示内存管理,后续版本的内存可能会有变更不一致的地方,详细的解释主要放在taskManager中

1 内存分配




jvm metaspace存放jvm加载的类的元数据
还有一些想 Network 这种网络开销,一半不涉及修改的内存,没有标出来。

内存数据结构:
flink最小内存分配单元 是内存段MemorySegment 默认32k。

2 内存设置思路 2.1 配置举例

在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

2.2 配置思路 2.2.1 并行度,slot,taskmanager数量三者的关系

简单点说 并行度>=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,来补充

设置parallelism有多中方式,优先级为api>env>p>file

2.2.2 资源大小选择 2.2.2.1 举例:

假设设置单个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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/749605.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号