Flink内存管理之Task Manager内存管理

Task Manager内存模型

Flink的程序运行在内存中。不管是我们在学习C语言、Java语言的时候,我们都很想知道程序到底是如何管理内存的。Flink程序也一样,当我们写完Flink程序,我们需要为Flink程序分配运行的资源,那针对什么样的数据量,需要分配多少内存,以及将来在程序运行的过程中,出现性能瓶颈的地方,如何调整优化等等,我们都非常有必要先学习、理解Flink的内存管理。

 

我们知道,Flink不管是运行在Standalone或者是YARN集群,都需要运行对应的Job Manager和Task Manager。所以,而且Flink也是可以基于内存进行迭代式计算的计算框架,而要能够达到高效运行Flink Job的目的,Flink自身必须要能够提供优秀的内存管理,以此来保证利用更小的资源、并保证Job执行的稳定性。

 

在我之前写的这篇文章里,当场打脸面试官,Flink流处理任务到底啥时候释放?,大家可以看到,Flink的Task都是运行在Task Manager中的。所以Task Manager的内存管理效率,直接决定了任务的执行效率。

 

在Web UI中,点开任意的一个Task Manager,我们可以看到该Task Manager的相关资源信息。例如:该Task Manager能够使用的物理内存是6.64GB、JVM堆内存的大小是1.55GB、以及Flink管理的内存是1.34GB。

 

Flink内存管理之Task Manager内存管理_第1张图片

其中,有一个Flink Memory Model的图,它清晰地描述了Flink的Task Manager进程的内存区域。Task Manager的内存模型相对于Job Manager是要复杂一些的。因为它是任务运行的地方。

Flink内存管理之Task Manager内存管理_第2张图片

 

Flink的Task Manager是一个JVM进程。通过Linux的ps命令,我们可以看到Task Manager的进程启动命令。如下所示:

/opt/jdk1.8.0_241//bin/java -XX:+UseG1GC -Xmx1664299798 -Xms1664299798 -XX:MaxDirectMemorySize=493921243 -XX:MaxMetaspaceSize=268435456 -Dlog.file=/opt/flink-1.12.0/log/flink-root-taskexecutor-0-node2.log …(其他省略)

 

我们可以看到Flink启动的Java进程,指定使用的是G1 GC来进垃圾回收。并且桶-Xmx来指定,当前最大的堆内存为1.5GB,通过-Xms来指定初始的堆内存大小,也为1.5GB。还有NIO buffer的大小为500M左右,还有就是Metaspace最大扩容内存为256MB。

 

这也说明,我们的Task都将运行在这一各名为Task Manager的JVM进程中。接下来,我们来分析以下该JVM进程的内部结构。

你可能感兴趣的:(Flink,flink)