TaskManager内存模型

89 阅读3分钟
1.JVM:
    <1>元空间 (JVM Metaspace):256M,从JDK 8开始,JVM把永久代拿掉了。类的一些元数据放在叫做MetaspaceNative Memory中。在Flink中的JVM Metaspace Memory也一样,它配置的是Task Manager JVM的元空间内存大小。
      作用:存储类的元数据(如类名、方法、变量等)、动态加载UDF函数、运行时常量池
    <2>JVM执行开销 (JVM Overhead);保留给JVM其他的内存开销。例如:Thread Stack、code cache、GC回收空间等等。和Network Memory的配置方法类似。它也由三个配置(两种方式)决定:
    一:按固定大小
        taskmanager.memory.jvm-overhead.min:默认为192MB,
        taskmanager.memory.jvm-overhead.max:默认为1GB
    二:按比例 是进程内存TPM的占比
        taskmanager.memory.jvm-overhead.fraction:默认为0.12.Flink内存(Total Flink Memory):进程内存(Total Process Memory) - JVM
    (1)堆内 (JVM Heap)
        <1>框架内存 (Framework Heap):固定128M
        <2>Task堆内存 (Task Heap):不直接指定(flink内存剩余的所有内存)这个参数的默认为:Total Flink MemoryFramework HeapTask off-heap memory – Managed MemoryNetwork Memory。他是Task Executor的执行内存,就是你的处理代码逻辑所能用到的内存
    (2)堆外内存 (Off-Heap Memory)
        <1>托管内存 (Managed Memory):默认是Flink内存*0.4  它主要用于开窗、排序、哈希表、中间结果缓存(状态)、RocksDB的backend。其实它是Task Executor管理的off-heap内存。
        <2>框架内存 (Framework Off-Heap):固定128M
        <3>Task堆外内存 (Task Off-Heap):0B
        <4>网络内存 (Network):默认是Flink内存*0.1 
            Network Memory使用的是Directory memory,在TaskTask之间进行数据交换时(shuffle),需要将数据缓存下来,缓存能够使用的内存大小就是这个Network Memory。它由是三个参数决定:
    taskmanager.memory.network.min:默认为64MB
    taskmanager.memory.network.max:默认为1gb
    taskmanager.memory.network.fraction:默认为0.1
    一种配置按照百分比配,另外一种按照min和max配

image.png

以上图为例子:TPM=16G,JVM=1G+256M=1.256G,那么因此,TFM=16-1.256=14.744G

默认的=> MM=TFM * 0.4=5.9G;NET=TFM * 0.1=1.4G;FH=128M;FOH=128M;TOH=0

最终:可用于Task Executor的内存(TH)=TFM-(MM+NET+FH+FOH+TOH)=7.25G

有一个Total Process Memory和一个Total Flink Memory

(1) Total Process Memory表示整个Task Manager的进程内存,所有这张图的内存加在一块就是Total Process Memory。taskmanager.memory.process.size: 4096m,这个配置就是对Task Manager配置的总使用内存的all in one配置。

(2) Total Flink Memory表示Task Executor消耗的所有内存,也就是除了JVM Metaspace和JVM Overhead其他的加在一起就是Total Flink Memory。其中Task Executor是专门负责执行Flink任务的,可以执行多个任务。通过查看Flink TaskManager的日志,可以说Task Executor这个组件实现了非常重要的一些功能。

Task Manager上资源的分配、任务的执行都是由Task Executor来实现的。而这个Total Flink Memory就表示Task Executor能够使用的内存总量。

补充一点:Flink的集群监控中的TaskManager Memory NonHeap其实是Off-Heap Memory加上JVM的非堆部分(JVM Metaspace和JVM Overhead)

思考:Flink做checkpoint的时候,ckid存在哪里?