Flink内存模型

  之前聊Flink的slot时简单提到过内存,Flink计算框架的内存大致分为Flink使用的内存、Jvm使用的内存。Flink为什么不全使用JVM内存的原因是显而易见的,作为实时计算框架,JVM内存依赖GC自动回收一旦稍微慢一点,就会对系统性能造成巨大影响,而且使用JVM内存容易内存溢出,所以Flink是主动拥抱内存管理的,充分发挥机器内存的性能。

    下面我们来看看JobManager和TaskManager的内存模型,如图1

由图1可以看出无论是jobmanager或者taskmanager进程占用的总内存都是Flink使用内存+Jvm使用的内存,Flink内存管理关注taskmanager的即可,jobmanager进程内存管理相对简单,下面对taskmanager的内存进行分类展示描述。

    Flink使用的内存主要分为JVM堆内、堆外内存,具体分类如下:

1.JVM堆上内存

   堆上内存管理序列化之后的数据,如果需要处理的数据超出了内存限制,则会将部分数据存储到硬盘上。堆上内存在写磁盘或网络传输时至少需要一次内存复制。

(1)框架堆上内存即Flink框架本身所使用的内存,即TaskManager本身所占用的堆上内存,不计入Slot资源中,可通过taskmanager.memory.framework.heap.size=128MB配置。

(2)Task堆上内存即执行Flink代码使用的堆上内存,可通过taskmanager.memory.task.heap.size进行配置。

2.JVM堆外内存

    使用堆外内存,可以将大量的数据保存在堆外,极大地减小堆内存,避免GC和内存溢出的问题。堆外内存在写磁盘或网络传输时是零拷贝,堆外内存是进程间共享的,jvm崩溃也不会导致数据丢失。堆内内存的使用、监控、调试简单,堆外内存出现问题后的诊断则较为复杂。

(1)框架堆外内存即Flink框架本身所使用的内存,不计入Slot资源,比如taskmanager的内存可通过taskmanager.memory.framework.off-heap.size=128MB进行配置。

(2)Task堆外内存即执行Flink代码使用的堆外内存,taskmanager内存可通过taskmanager.memory.task.off-heap.size=0进行配置。

(3)网络缓冲内存即网络数据交换所使用的堆外内存大小,如网络数据交换缓冲区(Network Buffter),可通过taskmanager.memory.network.[64/1024/0.1](min/max/fraction),默认min=64MB,max=1GB,fraction=0.1进行配置。

(4)堆外托管内存即Flink管理的堆外内存,可通过taskmanager.memory.managed.[size|fraction],默认值fraction=0.4进行配置。

    Jvm使用的内存具体分类如下:

(1)JVM元空间即JVM元空间所使用的内存,可通过参数taskmanager.memory.jvm-metaspace=96m进行配置。
(2)JVM执行开销即JVM在执行时自身所需要的内容,包括线程堆栈、IO、编译缓存等所使用的内存。可通过taskmanager.memory.jvm-overhead=[min/max/fraction],默认min=192MB,max=1GB,fraction=01进行配置。

  

 

 

posted @ 2024-05-20 14:41  人不疯狂枉一生  阅读(47)  评论(0编辑  收藏  举报