title: Flink系列

五、Flink 内存模型全详解

5.1 Flink Application 运行流程回顾

Flink 应用程序的 DataFlow:

Flink Task 和 TaskSlot 和 TaskManager 之间的关系:

虚线框表示一个 OperatorChain ,OperatorChain 就是一个特殊的 Operator

Slot 共享: 上下游 Operator 的 Task 才能共享

基于上图,可以看到TaskManager 之间存在着数据传输!

Flink TaskManager 和 TaskManager 之间的数据传输关系:

进入箭头:表示接收到上游 发送过来的 数据,接收到数据,执行处理

输出箭头:表示当前 Task 执行完了计算,继续把数据发送给下游

5.2 Flink 内存管理

JVM 管理内存的缺陷,这其实是一些共性问题,Spark, HBase 等等,都会涉及到内存模型。

1、Java 对象存储密度低:一个只包含 boolean 属性的对象占用 16 个字节 。 内存:对象头占了 8 个, boolean 属性占了 1 个,对其填充占了 7 个,而实际只需要一个bit(1/8字节)就够了。

2、Full GC 会极大地影响性能,尤其是为了处理更大数据而开了很大内存空间的 JVM 来说,GC 会达到秒级甚至分钟级。

大量的内存碎片,会把 JVM 的堆内存划分成一个个的区域。 Student student = new Student();, 虽然我只需要存储一个 int,但是我一口气,申请 32 个int。 Segment。

3、OOM 问题影响稳定性:OutOfMenoryError 是分布式计算框架经常会遇到的问题,当 JVM 中所有 对象大小超过分配给 JVM 的内存大小时,就会发生OutOfMenoryError 错误,导致 JVM 崩溃,分布式框架的健壮性和性能都会受到影响。

5.3 Flink 内存模型

官网的几个链接:

https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/deployment/memory/mem_setup/

https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/deployment/memory/mem_setup_tm/

https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/deployment/memory/mem_setup_jobmanager/

Flink 的内存模型从 Flink-1.10 发生了比较大的改变,新版本的内存模型如下:

关于上图中的各种名称解释: 1、Total Process Memory,TaskManager 进程总内存,比如在 YARN 环境中,其实就是 Container 的内存大小。

taskmanager.memory.process.size :无默认值,需要用户指定。

2、Total Flink Memory,Flink 总内存,TaskManager 进程占用的所有与 Flink 相关的内存(不包括 JVM 元空间和其他额外开销)。具体包含4大块:Flink 框架内存(堆内、堆外)、托管内存(仅堆外)、网络缓存(仅堆外)、任务内存(堆内、堆外)。

taskmanager.memory.flink.size :无默认值,需要用户指定。

3、FrameWork Heap / Off-heap,Flink 框架内存,Flink Runtime 底层占用的内存,一般来讲相对固定,不需要更改。一般在 Flink 算子并行度特别高的时候,才需要调整。

taskmanager.memory.framework.heap.size :堆内部分(Framework Heap),默认值 128MB;

taskmanager.memory.framework.off-heap.size :堆外部分(Framework Off-Heap),以直接内存形式分配,默认值 128MB。

4、Managed Memory,Flink 托管内存,纯堆外内存,由 MemoryManager 管理,用于中间结果缓存、排序、哈希表等,以及 RocksDB 状态后端。

taskmanager.memory.managed.fraction :托管内存占Flink总内存 taskmanager.memory.flink.size 的比例,默认值 0.4;

taskmanager.memory.managed.size :托管内存的大小,无默认值,一般也不指定,而是依照上述比例来推定,更加灵活。

5、Network 网络内存, 纯堆外内存,用于 TaskManager 之间(shuffle、广播等)及与外部组件的数据传输,以直接内存形式分配。

taskmanager.memory.network.min :网络缓存的最小值,默认 64MB;

taskmanager.memory.network.max :网络缓存的最大值,默认 1GB;

taskmanager.memory.network.fraction :网络缓存占 Flink 总内存 taskmanager.memory.flink.size 的比例,默认值 0.1。若根据此比例算出的内存量比最小值小或比最大值大,就会限制到最小值或者最大值。

6、Task heap / Off-heap 内存,是算子逻辑和用户代码、自定义数据结构真正占用的内存。 taskmanager.memory.task.heap.size :堆内部分(Task Heap),无默认值,一般不建议设置,会自动用 Flink 总内存减去框架、托管、网络三部分的内存推算得出。

taskmanager.memory.task.off-heap.size :堆外部分(Task Off-Heap),以直接内存形式分配,默认值为 0,即不使用。

7、JVM Metaspace,Flink JVM 进程的元数据空间大小

taskmanager.memory.jvm-metaspace.size :默认值 256MB。

8、JVM Overhead,为 JVM 进程预留的其他本地内存,用于线程栈、代码缓存、垃圾收集。它是 Total Process Memory(整个进程) 的一个有上下限的细分组件。

taskmanager.memory.jvm-overhead.min :JVM 额外开销的最小值,默认 192MB;

taskmanager.memory.jvm-overhead.max :JVM 额外开销的最大值,默认 1GB;

taskmanager.memory.jvm-overhead.fraction :JVM 额外开销占 TM 进程总内存 taskmanager.memory.process.size (注意不是 Flink 总内存)的比例,默认值 0.1。若根据此比例算出的内存量比最小值小或比最大值大,就会限制到最小值或者最大值。

生产环境中,需要调整的参数:

(1)在 Standalone 模式下,调整 taskmanager.memory.flink.size 指定 Flink 从节点 TaskManager 总内存

(2)在 Flink On YARN 模式下,调整 taskmanager.memory.process.size 指定 Flink 从节点 TaskManager 总内存

(3)根据网络流量大小修改网络缓存占比:taskmanager.memory.network.fraction,默认 0.1

(4)根据 RocksDB 状态大小等调整托管内存占比:taskmanager.memory.managed.fraction,默认 0.4

生产案例:如果是 Flink On YARN 模式下

taskmanager.memory.process.size = 4096 MB = 4G

taskmanager.memory.network.fraction = 0.15

taskmanager.memory.managed.fraction = 0.45

然后根据以上参数,就可以计算得到各部分的内存大小:

taskmanager.memory.jvm-overhead = 4096 * 0.1 = 409.6 MB

taskmanager.memory.flink.size = 4096 - 409.6 - 256 = 3430.4 MB

taskmanager.memory.network = 3430.4 * 0.15 = 514.56 MB

taskmanager.memory.managed = 3430.4 * 0.45 = 1543.68 MB

taskmanager.memory.task.heap.size = 3430.4 - 128 * 2 - 1543.68 - 514.56 = 1116.16 MB

Task Heap 还要被均分:一个 TaskManager 指定了两个 Slot: 1116 = 558M * 2

上述的区域划分,是一个逻辑划分,并不是一个物理划分。

另外,还有可以指定 JVM 相关参数的一些选项的时候,也注意:

JVM 参数选项内存组成-Xmx and -XmsFramework + Task Heap Memory-XX:MaxDirectMemorySizeFramework + Task Off-Heap + Network Memory-XX:MaxMetaspaceSizeJVM Metaspace

声明:         文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。

By luoyepiaoxue2014

B站: https://space.bilibili.com/1523287361 点击打开链接 微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接

参考链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。