大家好,我是老兵。
内存和IO一直是分布式系统的核心内容。进程间数据交换、读写,尤其是海量数据的复杂运算将消耗机器的大量内存,如何有效管理和使用内存是考量优秀架构设计的重要一环。
作为在流处理和批处理领域的优秀框架代表—Flink和Spark,其内部均有完善的内存管理模式,本期老兵将带大家学习两者的内存管理机制,希望能给大家予以些许帮助。
1 Flink内存管理机制
Apache Flink是开源的大数据实时计算框架,具有分布式、高性能、内存计算等特点。Flink因其独特的流批一体设计模式,被广泛应用于实时和离线数据应用场景。

Flink的数据流计算中分布式快照和状态会占用大量内存,其内部是如何管理内存的呢?
1.1 Flink 内存模型
这里只看
TaskManager的内存模型,JobManger内存模型比较简单,可自行百度~

Flink 内存模型
1)整体结构
-
TaskManager内存:Flink TM内存 + JVM内存 -
Flink TM内存:堆内内存 + 堆外内存 -
堆内内存:框架堆上内存 + Task堆上内存 -
堆外内存:直接内存 + 管理内存 + JVM内存 -
直接内存:框架堆外内存 + Task堆外内存 + 网络缓冲区 -
JVM内存:JVM元空间 + JVM执行开销
2)JVM 元空间(JVM Metaspace)
-
存放JVM元数据:比如JVM class对象、方法名等
-
参数:
taskmanager.memory.jvm-metaspace.size,默认为256M
3)JVM 执行开销(over-head)
-
JVM执行时内存,包含线程、栈堆、IO与编译缓存使用的内存
- 配置参数
-
taskmanager.memory.jvm-overhead.fraction,默认0.1(根据TM进程内存占比,阈值在min-max间) -
taskmanager.memory.jvm-overhead.min:默认192M
-

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



