大家好,我是老兵。
内存
和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
-