-
jvm内存优化
-
内存优化
-
netty优化
-
akka优化
-
并行度优化
-
对象重用
-
checkpoint优化
-
网络内存调优
-
状态优化
-
flink数据倾斜优化
-
flink背压
jvm内存参数调优
Flink是依赖内存计算,计算过程中内存不够对Flink的执行效率影响很大。可以通过监控GC(Garbage Collection),评估内存使用及剩余情况来判断内存是否变成性能瓶颈,并根据情况优化。
监控节点进程的YARN的Container GC日志,如果频繁出现Full GC,需要优化GC。
GC的配置:在客户端的"conf/flink-conf.yaml"配置文件中,在“env.java.opts”配置项中添加参数:
-Xloggc:<LOG_DIR>/gc.log
-XX:+PrintGCDetails
-XX:-OmitStackTraceInFastThrow
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=20
-XX:GCLogFileSize=20M
此处默认已经添加GC日志。
调整老年代和新生代的比值。在客户端的“conf/flink-conf.yaml”配置文件中,在“env.java.opts”配置项中添加参数:“-XX:NewRatio”。如“ -XX:NewRatio=2”,则表示老年代与新生代的比值为2:1,新生代占整个堆空间的1/3,老年代占2/3。
可以通过设置 jobmanager.memory.enable-jvm-direct-memory-limit
对 JobManager 进程的 JVM 直接内存进行限制
Flink内存调优
flink进程内存
jobmanager相关配置:
taskamanger相关配置:
yarn相关的配置:
yarn.appmaster.vcores YARN应用程序主机使用的虚拟核心(vcore)的数量。
yarn.containers.vcores 每个YARN容器的虚拟核心数(vcore)。默认情况下,vcore数设置为每个TaskManager的插槽数(如果已设置),否则设置为1。为了使用此参数,您的群集必须启用CPU调度。您可以通过设置来做到这一点org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler。
yarn.scheduler.maximum-allocation-vcores
yarn.scheduler.minimum-allocation-vcores
Flink单个task manager的slot数量必须介于这两个值之间
yarn.scheduler.maximum-allocation-mb
yarn.scheduler.minimum-allocation-mb
Flink的job manager 和task manager内存不得超过container最大分配内存大小。
yarn.nodemanager.resource.cpu-vcores yarn的虚拟CPU内核数,建议设置为物理CPU核心数的2-3倍,如果设置过少,会导致CPU资源无法被充分利用,跑任务的时候CPU占用率不高。
netty优化
Netty Shuffle环境
Network Communication (via Netty)
akka优化
akka.ask.callstack
捕获异步请求的调用堆栈。注意,如果有数百万个并发RPC调用,这可能会增加内存占用。
akka.ask.timeout
用于期望并阻止Akka呼叫的超时。如果Flink由于超时而失败,则应尝试增加此值。超时可能是由于计算机运行缓慢或网络拥塞引起的。超时值需要一个时间单位说明符(ms / s / min / h / d)。
akka.client-socket-worker-pool.pool-size-factor
池大小因子使用以下公式确定线程池大小:ceil(available processors * factor)。然后,结果大小受pool-size-min和pool-size-max值限制。
akka.client-socket-worker-pool.pool-size-max
要限制基于因素的最大线程数。
akka.client-socket-worker-pool.pool-size-min
最小线程数以上限为基础。
akka.client.timeout 60s
客户端上所有阻塞呼叫的超时。
akka.fork-join-executor.parallelism-factor
并行度因子用于通过以下公式确定线程池大小:ceil(available processors * factor)。然后,所得到的大小由并行度最小值和并行度最大值限制。
akka.fork-join-executor.parallelism-max
最大线程数上限为基于因子的并行数。
akka.fork-join-executor.parallelism-min
最小线程数以基于因素的并行度为上限。
akka.framesize 10485760b(10MB)
在JobManager和TaskManager之间发送的消息的最大大小。如果Flink因消息超出此限制而失败,则应增加该限制。消息大小需要大小单位说明符。
akka.fork-join-executor.parallelism-factor
并行度因子用于使用以下公式确定线程池大小:ceil(可用处理器*因子)。然后,结果大小由并行度最小值和并行度最大值限制。
akka.fork-join-executor.parallelism-max
基于并行度的最大线程数上限
akka.fork-join-executor.parallelism-min
基于并行度的最大线程数下限
akka.framesize
JobManager和TaskManager之间发送的最大消息大小。如果Flink失败是因为消息超过了这个限制,那么您应该增加它。消息大小需要大小单位说明符。
akka.retry-gate-closed-for
远程连接断开后,闸门应关闭几毫秒。
akka.server-socket-worker-pool.pool-size-factor
池大小因子用于使用以下公式确定线程池大小:ceil(可用处理器*因子)。然后,结果大小由池大小最小值和池大小最大值限定。
akka.server-socket-worker-pool.pool-size-max
基于上限因子的最大线程数。
akka.server-socket-worker-pool.pool-size-min
基于上限因子的最小线程数
akka.tcp.timeout
所有