配置flink进程的内存
配置总内存
Flink JVM 进程的*进程总内存(Total Process Memory)*包含了由 Flink 应用使用的内存(Flink 总内存)以及由运行 Flink 的 JVM 使用的内存。 Flink 总内存(Total Flink Memory)包括 JVM 堆内存(Heap Memory)和堆外内存(Off-Heap Memory)。 其中堆外内存包括直接内存(Direct Memory)和本地内存(Native Memory)。
配置 Flink 进程内存最简单的方法是指定以下两个配置项中的任意一个:
配置项 | TaskManager 配置参数 | JobManager 配置参数 |
---|---|---|
Flink总内存 | taskmamager.memory.flink.size | jobmanager.memory.flink.size |
进程总内存 | taskmanager.memory.process.size | jobmanager.memory.process.size |
flink有三种部署方式,一种为本地模式,一种为standalone模式,还有一种为yarn或者mesos模式,这三种模式中,用户必须要选择一种进行配置(本地模式除外),否则flink将无法启动,这意味着,用户需要从以下的无默认值的配置参数中选择一个给出明确的配置
TaskManager: | JobManager |
---|---|
taskmanager.memory.flink.size | jobmanager.memory.flink.size |
taskmanager.memory.process.size | jobmanager.memory.process.size |
taskmanager.memory.task.heap.size taskmanager.memory.task.managed.size |
jobmanager.memory.heap.size |
不建议同时设置进程总内存和 Flink 总内存。 这可能会造成内存配置冲突,从而导致部署失败。 额外配置其他内存部分时,同样需要注意可能产生的配置冲突
JVM参数
Flink 进程启动时,会根据配置的和自动推导出的各内存部分大小,显式地设置以下 JVM 参数:
JVM参数 | TaskManager取值 | JobManager取值 |
---|---|---|
-Xmx 和 -Xms | 框架堆内存+任务堆内存 | JVM堆内存 |
-XX:MaxDirectMemorySize (TaskManager 始终设置,JobManager 见注释) |
框架堆外内存 + 任务堆外内存 + 网络内存 | 堆外内存 |
-XX:MaxMetaspaceSize | JVM Metaspace | JVM Metaspace |
受限的等比内存部分
本节介绍下列内存部分的配置方法,它们都可以通过指定在总内存中所占比例的方式进行配置,同时受限于相应的的最大/最小值范围。
- JVM 开销:可以配置占用进程总内存的固定比例
- 网络内存:可以配置占用 Flink 总内存的固定比例(仅针对 TaskManager)
相关内存部分的配置方法,请同时参考
TaskManager
和 JobManager 的详细内存模型。
这些内存部分的大小必须在相应的最大值、最小值范围内,否则 Flink 将无法启动。 最大值、最小值具有默认值,也可以通过相应的配置参数进行设置。 例如,如果仅配置下列参数:
- 进程总内存 = 1000Mb
- JVM 开销最小值 = 64Mb
- JVM 开销最大值 = 128Mb
- JVM 开销占比 = 0.1
那么 JVM 开销的实际大小将会是 1000Mb x 0.1 = 100Mb,在 64-128Mb 的范围内。
如果将最大值、最小值设置成相同大小,那相当于明确指定了该内存部分的大小。
如果没有明确指定内存部分的大小,Flink 会根据总内存和占比计算出该内存部分的大小。 计算得到的内存大小将受限于相应的最大值、最小值范围。 例如,如果仅配置下列参数:
- 进程总内存 = 1000Mb
- JVM 开销最小值 = 128Mb
- JVM 开销最大值 = 256Mb
- JVM 开销占比 = 0.1
那么 JVM 开销的实际大小将会是 128Mb,因为根据总内存和占比计算得到的内存大小 100Mb 小于最小值。
如果配置了总内存和其他内存部分的大小,那么 Flink 也有可能会忽略给定的占比。 这种情况下,受限的等比内存部分的实际大小是总内存减去其他所有内存部分后剩余的部分。 这样推导得出的内存大小必须符合最大值、最小值范围,否则 Flink 将无法启动。 例如,如果仅配置下列参数:
- 进程总内存 = 1000Mb
- 任务堆内存 = 100Mb(或 JobManager 的 JVM 堆内存)
- JVM 开销最小值 = 64Mb
- JVM 开销最大值 = 256Mb
- JVM 开销占比 = 0.1
进程总内存中所有其他内存部分均有默认大小,包括 TaskManager 的托管内存默认占比或 JobManager 的默认堆外内存。 因此,JVM 开销</