• Flink 内存模型


    Jobmanage内存模型

    1G 1C 的配置

    上图不够直观,用户大脑无法第一反应出内存构成。

    Total Process Memory = JVM堆内存 + JVM堆外内存(堆外内存+ JVM元空间 +JVM自身运行内存)

    Total Flink Memory = JVM堆内存 + 堆外内存

    参数控制:

    Total Process Memory 对应 jobmanager.memory.process.size 。

    Total Flink Memory 对应 jobmanager.memory.flink.size 。

    Off-Heap Memory 堆外内存 对应 jobmanager.memory.off-heap.size 默认128mb。

    JVM Metaspace 对应 jobmanager.memory.jvm-metaspace.size 默认256mb 。

    JVM Overhead 用于 JVM 开销的本地内存,例如栈空间、垃圾回收空间等

    • jobmanager.memory.jvm-overhead.fraction:默认值 0.1(Total Process Memory的0.1)

    • jobmanager.memory.jvm-overhead.min:默认值192mb。

    • jobmanager.memory.jvm-overhead.max:默认值1gb。

    1G内存,1024*0.1 = 102.4 <192. 所以默认192mb.

    Total Process Memory = JVM堆内存 + JVM堆外内存(堆外内存+ JVM元空间 +JVM自身运行内存)

    1024M = ? + 128M +256M + 192M

    所以 jvm heap 的大小为 448M。

    Taskmanage 内存模型

      搞明白内存配置,默认配置及比例

      生产环境内存如何配置

        什么场景配置什么样的配置?

    Total Flink Memory = JVM heap + Management Memory + Direct Meomory

    Total Flink Memory = (①Framework Heap + ②Task Heap)

    + ③ Management Memory

    + (④ Framework Off-Heap +⑤Task Off-Heap + ⑥ Network)

    Total Process Memory = Total Flink Memory + ⑦JVM Metaspace + ⑧JVM Overhead

    进程内存3部分,flink总内存+ 元空间+ JVM运营内存。

    Flink内存6部分,JVM内分F T heap;

    JVM 外分 管理内存和直接内存 ;

    直接内存分 网络内存和堆外FT off-heap;

    参数控制:

    Total Process Memory 对应 taskmanager.memory.process.size 。

    Total Flink Memory 对应

    包括6部分

    ① Framework heap 对应 taskmanager.memory.framework.heap.size 默认为128m

    为Task Executor本身所配置的堆内存大小,因为Task Executor本身也是一个Java。Framework Heap是Flink框架保留的,是不会用来执行Task的。

    ②Task Heap 对应 taskmanager.memory.task.heap.size

    默认为:

    Total Flink Memory– Framework Heap -Framework Off-Heap – Managed Memory– Task off-heap memory – Network Memory

    ③Management Memory 对应 taskmanager.memory.managed.fraction 默认0.4 (Total Flink Memory的0.4)

    纯堆外内存,由MemoryManager管理,用于中间结果缓存、排序、哈希表等,以及RocksDB状态后端。可见,RocksDB消耗的内存可以由用户显式控制了,不再像旧版本一样难以预测和调节。

    ④Framework Off-heap 对应 taskmanager.memory.framework.off-heap.size 默认为128M

    为 Task Executor保留的off-heap memory,不会分配给任何slot。

    ⑤task Off-heap 对应 taskmanager.memory.task.off-heap.size来配置,默认为0。

    为Task Executor执行的Task所使用的堆外内存。如果在Flink应用的代码中调用了Native的方法,需要用到off-heap内存,这些内存会分配到Off-heap堆外内存中。可以通过指定如果代码中需要调用Native Method并分配堆外内存,一般不使用。

    ⑥Network 对应

    在Task与Task之间进行数据交换时(shuffle),需要将数据缓存下来,缓存能够使用的内存大小就是这个Network Memory。它由是三个参数决定:

    • taskmanager.memory.network.min:默认为64MB

    • taskmanager.memory.network.max:默认为1gb

    • taskmanager.memory.network.fraction:默认为0.1

    Network Memory有两种配置方式

    1、通过taskmanager.memory.network.fraction参数,默认为Total Flink Meory的10%。

    2、通过taskmanager.memory.network.min和taskmanager.memory.network.max指定shuffle缓存在min-max之间的内存空间。如果使用fraction计算出来的Network Meory超出min-max的范围,那么以min-max为准。如果配置的min和max是一样的值,就使用固定的内存大小。

    JVM Metaspace 对应 taskmanager.memory.jvm-metaspace.size ,默认为256MB

    JVM Overhead 保留给JVM其他的内存开销。例如:Thread Stack、code cache、GC回收空间等等。和Network Memory的配置方法类似,由三个配置决定:

    • taskmanager.memory.jvm-overhead.min:默认为192MB,

    • taskmanager.memory.jvm-overhead.max:默认为1GB

    • taskmanager.memory.jvm-overhead.fraction:默认为Total Process Memory 的0.1。

    注意:Flink官方也建议我们不要同时配置taskmanager.memory.process.size和taskmanager.memory.process.size。

    实战: tm 1c 1G 配置 参数

    taskmanager.memory.process.size=1024M

    taskmanager.memory.managed.fraction=0.01

    taskmanager.memory.network.fraction=0.01

    taskmanager.memory.jvm-metaspace.size=128m

    taskmanager.memory.framework.off-heap.size=128m

    taskmanager.memory.jvm-overhead.fraction=0.1

    taskmanager.memory.jvm-overhead.min=128m

    上图的值由下往上解释:

    1 、JVM overhead 1024*0.1=102.4 <128 所以JVM overhead = 128M

    2、Jvm metaspace指定了jvm metaspace的参数为128,所以看到界面为128M

    3、Network的64怎么来的呢,(1024-128-128)*0.01 = 7.68 < taskmanager.memory.network.min=64(默认值)

    4、Task Off-heap 始终为0

    5、Framework.off-heap 128 指定了具体参数 128。

    6、Managed memory 7.68 指定了因子为0.01 (1024-128-128)*0.01 = 7.68。

    7、Framework-heap 默认值为128,参数中没指定所以为128M。

    所以task heap = 1024 - 128 -128 -64 - 0 - 128 - 7.68 -128 = 440.32

  • 相关阅读:
    【小白学YOLO】YOLOv3网络结构细致解析
    【运维心得】如何进行应用日志分析?
    盘点| 爆款小游戏的开发引擎
    k个相等的子集
    【LLM】transformer介绍,为啥要有QKV?
    前端滚动分页
    五面腾讯技术专家岗,已拿offer,这些面试题你能答出多少? 还不来学习啊!
    字节序详细解读
    JVM(Java虚拟机) 整理(一):基础理论
    Java设计模式(一)—设计模式概述
  • 原文地址:https://blog.csdn.net/yelangshisan/article/details/133265706