Flink学习笔记(二):Flink内存模型

文章目录

1、配置总内存

Flink JVM 进程的进程总内存(Total Process Memory)包含了由 Flink 应用使用的内存(Flink 总内存)以及由运行 Flink 的 JVM 使用的内存。 Flink 总内存(Total Flink Memory)包括 JVM 堆内存(Heap Memory)和堆外内存(Off-Heap Memory)。 其中堆外内存包括直接内存(Direct Memory)和本地内存(Native Memory)。详细的配置参数:https://nightlies.apache.org/flink/flink-docs-release-1.12/zh/deployment/config.html

配置 Flink 进程内存最简单的方法是指定以下两个配置项中的任意一个:

配置项 TaskManager 配置参数 JobManager 配置参数
Flink 总内存 taskmanager.memory.flink.size jobmanager.memory.flink.size
进程总内存 taskmanager.memory.process.size jobmanager.memory.process.size

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.managed.size jobmanager.memory.heap.size

不建议同时设置进程总内存和 Flink 总内存。 这可能会造成内存配置冲突,从而导致部署失败。 额外配置其他内存部分时,同样需要注意可能产生的配置冲突。

2、JobManager 内存模型

如上图所示,下表中列出了 Flink JobManager 内存模型的所有组成部分,以及影响其大小的相关配置参数。

组成部分 配置参数 描述
JVM 堆内存 jobmanager.memory.heap.size JobManager 的 JVM 堆内存。
堆外内存 jobmanager.memory.off-heap.size JobManager 的堆外内存(直接内存或本地内存)。
JVM Metaspace jobmanager.memory.jvm-metaspace.size Flink JVM 进程的 Metaspace。
JVM 开销 jobmanager.memory.jvm-overhead.min、jobmanager.memory.jvm-overhead.max、jobmanager.memory.jvm-overhead.fraction 用于其他 JVM 开销的本地内存,例如栈空间、垃圾回收空间等。该内存部分为基于进程总内存的受限的等比内存部分。

如配置总内存中所述,另一种配置 JobManager 内存的方式是明确指定 JVM 堆内存的大小(jobmanager.memory.heap.size)。 通过这种方式,用户可以更好地掌控用于以下用途的 JVM 堆内存大小。

3、TaskManager 内存模型

如上图所示,下表中列出了 Flink TaskManager 内存模型的所有组成部分,以及影响其大小的相关配置参数。

组成部分 配置参数 描述
框架堆内存(Framework Heap Memory) taskmanager.memory.framework.heap.size 用于 Flink 框架的 JVM 堆内存(进阶配置)。
任务堆内存(Task Heap Memory) taskmanager.memory.task.heap.size 用于 Flink 应用的算子及用户代码的 JVM 堆内存。
托管内存(Managed memory) taskmanager.memory.managed.size、taskmanager.memory.managed.fraction 由 Flink 管理的用于排序、哈希表、缓存中间结果及 RocksDB State Backend 的本地内存。
框架堆外内存(Framework Off-heap Memory) taskmanager.memory.framework.off-heap.size 用于 Flink 框架的堆外内存(直接内存或本地内存)(进阶配置)。
任务堆外内存(Task Off-heap Memory) taskmanager.memory.task.off-heap.size 用于 Flink 应用的算子及用户代码的堆外内存(直接内存或本地内存)。
网络内存(Network Memory) taskmanager.memory.network.min、taskmanager.memory.network.max、taskmanager.memory.network.fraction 用于任务之间数据传输的直接内存(例如网络传输缓冲)。该内存部分为基于 Flink 总内存的受限的等比内存部分。
JVM Metaspace taskmanager.memory.jvm-metaspace.size Flink JVM 进程的 Metaspace。
JVM 开销 taskmanager.memory.jvm-overhead.min、taskmanager.memory.jvm-overhead.max、taskmanager.memory.jvm-overhead.fraction 用于其他 JVM 开销的本地内存,例如栈空间、垃圾回收空间等。该内存部分为基于进程总内存的受限的等比内存部分。

我们可以看到,有些内存部分的大小可以直接通过一个配置参数进行设置,有些则需要根据多个参数进行调整。通常情况下,不建议对框架堆内存和框架堆外内存进行调整。 除非你非常肯定 Flink 的内部数据结构及操作需要更多的内存。 这可能与具体的部署环境及作业结构有关,例如非常高的并发度。 此外,Flink 的部分依赖(例如 Hadoop)在某些特定的情况下也可能会需要更多的直接内存或本地内存。

4、图形化展示

JobManager 内存直观展示

TaskManager 内存直观展示

树状图表示:

5、实际案例计算内存分配

如果是 Flink On YARN 模式下:

java 复制代码
taskmanager.memory.process.size = 4096 MB = 4G
taskmanager.memory.network.fraction = 0.15
taskmanager.memory.managed.fraction = 0.45

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

java 复制代码
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

Flink 启动参考配置参数:

java 复制代码
/home/dev/soft/flink/bin/flink run \
	-m yarn-cluster \
	-yD akka.ask.timeout='360 s' \
	-yD akka.framesize=20485760b \
	-yD blob.fetch.backlog=1000 \
	-yD blob.fetch.num-concurrent=500 \
	-yD blob.fetch.retries=50 \
	-yD blob.storage.directory=/data1/flinkdir \
	-yD env.java.opts.jobmanager='-XX:ErrorFile=/tmp/java_error_%p.log -XX:+PrintGCDetails -XX:-OmitStackTraceInFastThrow -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=300 -XX:InitiatingHeapOccupancyPercent=50 -XX:+ExplicitGCInvokesConcurrent -XX:+AlwaysPreTouch -XX:AutoBoxCacheMax=20000 -XX:G1HeapWastePercent=5 -XX:G1ReservePercent=25 -Dfile.encoding=UTF-8' \
	-yD env.java.opts.taskmanager='-XX:ErrorFile=/tmp/java_error_%p.log -XX:+PrintGCDetails -XX:-OmitStackTraceInFastThrow -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=300 -XX:InitiatingHeapOccupancyPercent=50 -XX:+ExplicitGCInvokesConcurrent -XX:+AlwaysPreTouch -XX:AutoBoxCacheMax=20000 -Dsun.security.krb5.debug=false -Dfile.encoding=UTF-8' \
	-yD env.java.opts='-XX:ErrorFile=/tmp/java_error_%p.log -XX:+PrintGCDetails -XX:-OmitStackTraceInFastThrow -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1024m -Dfile.encoding=UTF-8' \
	-yD execution.attached=false \
	-yD execution.buffer-timeout='1000 ms' \
	-yD execution.checkpointing.externalized-checkpoint-retention=RETAIN_ON_CANCELLATION \
	-yD execution.checkpointing.interval='30 min' \
	-yD execution.checkpointing.max-concurrent-checkpoints=1 \
	-yD execution.checkpointing.min-pause='2 min' \
	-yD execution.checkpointing.mode=EXACTLY_ONCE \
	-yD execution.checkpointing.timeout='28 min' \
	-yD execution.checkpointing.tolerable-failed-checkpoints=8 \
	-yD execution.checkpointing.unaligned=true \
	-yD execution.checkpointing.unaligned.forced=true \
	-yD heartbeat.interval=60000 \
	-yD heartbeat.rpc-failure-threshold=5 \
	-yD heartbeat.timeout=340000 \
	-yD io.tmp.dirs=/data1/flinkdir \
	-yD jobmanager.heap.size=1024m \
	-yD jobmanager.memory.jvm-metaspace.size=268435456b \
	-yD jobmanager.memory.jvm-overhead.max=1073741824b \
	-yD jobmanager.memory.jvm-overhead.min=1073741824b \
	-yD jobmanager.memory.network.fraction=0.2 \
	-yD jobmanager.memory.network.max=6GB \
	-yD jobmanager.memory.off-heap.size=134217728b \
	-yD jobmanager.memory.process.size='18360 mb' \
	-yD metrics.reporter.promgateway.deleteOnShutdown=true \
	-yD metrics.reporter.promgateway.factory.class=org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporterFactory \
	-yD metrics.reporter.promgateway.filter.includes=\*:dqc\*,uptime,taskSlotsTotal,numRegisteredTaskManagers,taskSlotsAvailable,numberOfFailedCheckpoints,numRestarts,lastCheckpointDuration,Used,Max,Total,Count,Time:gauge,meter,counter,histogram \
	-yD metrics.reporter.promgateway.groupingKey="yarn=${yarn};hdfs=${hdfs};job_name=TEST-broadcast-${jobName//./-}-${provId}" \
	-yD metrics.reporter.promgateway.host=172.17.xxxx.xxxx \
	-yD metrics.reporter.promgateway.interval='60 SECONDS' \
	-yD metrics.reporter.promgateway.jobName="TEST-broadcast-${jobName//./-}-${provId}" \
	-yD metrics.reporter.promgateway.port=10080 \
	-yD metrics.reporter.promgateway.randomJobNameSuffix=true \
	-yD pipeline.name="TEST-broadcast-${jobName//./-}-${provId}" \
	-yD pipeline.object-reuse=true \
	-yD rest.flamegraph.enabled=true \
	-yD rest.server.numThreads=20 \
	-yD restart-strategy.failure-rate.delay='60 s' \
	-yD restart-strategy.failure-rate.failure-rate-interval='3 min' \
	-yD restart-strategy.failure-rate.max-failures-per-interval=3 \
	-yD restart-strategy=failure-rate \
	-yD security.kerberos.krb5-conf.path=/home/dev/kerberos/krb5.conf \
	-yD security.kerberos.login.contexts=Client,KafkaClient \
	-yD security.kerberos.login.keytab=/home/dev/kerberos/xxxx.keytab \
	-yD security.kerberos.login.principal=xxxx \
	-yD security.kerberos.login.use-ticket-cache=false \
	-yD state.backend.async=true \
	-yD state.backend=hashmap \
	-yD state.checkpoints.dir=hdfs://xxxx/flink/checkpoint/${jobName//.//}/$provId \
	-yD state.checkpoint-storage=filesystem \
	-yD state.checkpoints.num-retained=3 \
	-yD state.savepoints.dir=hdfs://xxxx/flink/savepoint/${jobName//.//}/$provId \
	-yD table.exec.hive.fallback-mapred-writer=false \
	-yD task.manager.memory.segment-size=4mb \
	-yD taskmanager.memory.framework.off-heap.size=1GB \
	-yD taskmanager.memory.managed.fraction=0.2 \
	-yD taskmanager.memory.network.fraction=0.075 \
	-yD taskmanager.memory.network.max=16GB \
    -yD taskmanager.memory.process.size='50 gb' \
	-yD taskmanager.network.netty.client.connectTimeoutSec=600 \
	-yD taskmanager.network.request-backoff.max=120000 \
	-yD taskmanager.network.retries=100 \
    -yD taskmanager.numberOfTaskSlots=10 \
	-yD web.timeout=900000 \
	-yD web.upload.dir=/data1/flinkdir \
	-yD yarn.application.name="TEST-broadcast-${jobName//./-}-${provId}" \
	-yD yarn.application.queue=$yarnQueue \
	-yD yarn.application-attempts=10 \
相关推荐
艾莉丝努力练剑21 分钟前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
人生游戏牛马NPC1号2 小时前
学习 Flutter (三):玩安卓项目实战 - 上
android·学习·flutter
深圳卢先生4 小时前
CentOS 安装jenkins笔记
笔记·centos·jenkins
u_topian5 小时前
【个人笔记】Qt使用的一些易错问题
开发语言·笔记·qt
没有羊的王K5 小时前
SSM框架学习——day1
java·学习
林林要一直努力7 小时前
AOSP Settings模块问题初窥
android·学习·bug·android studio
余大侠在劈柴9 小时前
pdf.js 开发指南:在 Web 项目中集成 PDF 预览功能
前端·javascript·学习·pdf
WarPigs10 小时前
游戏框架笔记
笔记·游戏·架构
金心靖晨10 小时前
redis汇总笔记
数据库·redis·笔记
遇见尚硅谷11 小时前
C语言:20250714笔记
c语言·开发语言·数据结构·笔记·算法