网上参数众说纷纭不切实际
- 提交yarn任务参数设置:
参数 |
建议值 |
描述 |
-n (taskmanager) |
节点数*(4-8) |
1.10已废弃 该参数为Flink的taskmanager数目,Flink引擎运行需要由一个jobmanager以及若干个taskmanager构成。每个taskmanager都是独立的一部分,当有Flink应用需要运行时,会被随机分配到一个taskmanager运行,所以taskmanager的数目增多,可以互不干扰的并行运行更多的Flink应用。但是很显然,集群中的资源时有限的,taskmanager越多,单个taskmanager能够分配的资源则越少,也会导致Flink性能下降。所以,根据经验值,taskmanager数目可以取集群节点数*4 ~节点数*8。 |
-s (slot) |
根据实际场景配置 |
该参数为单个taskmanager所拥有的槽位数,Flink任务提交后,集群中可以使用的总槽位数即为slot * taskmanager。一个slot可以为一个taskmanager提供1个并发,例如slot=30,即1个taskmanager最多可以跑30并发,当然实际运行的时候,也可以只跑20并发,那么此时剩余10个slot即为空闲。剩余未使用的slot,并不会占用CPU资源,但是会占用相关内存资源。该参数的修改,根据实际需要用到的并发度而动态调节。在内存足够的情况下,可以适当设置较大。
扫描二维码关注公众号,回复:
13084469 查看本文章
|
-tm(taskmanager memory) |
30000 |
该参数为分配给单个taskmanager的内存资源。只要taskmanager内存足够使用,内存资源分配增多对性能也无直接提高。可以在jobmanager内存分配之后,先将所有剩余内存分配给taskmanager。根据经验值,分配30000MB左右即可。 |
–jm(jobmanager memory) |
5000 |
该参数为分配给jobmanager的内存资源。该参数对整体性能几乎无影响,不需要分配太大。根据经验值,分配5000MB~15000MB即可。 |
- 调优
- 提高cpu使用率同时减少额外性能开销
- 根据业务模型,设置合适的垃圾收集器,通过分析GC日志,设置合理的分区大小,GC线程并发度,减少full gc操作。
- 设置合理的TaskManager数量和每个TaskManager对应的slot数量,使每个节点上的有合理的任务并行度,注意slot数量不宜太高,避免线程的额外开销。
- 在算子中设置partition数量,防止内存不足GC。
- 防止数据倾斜,可以使用rebalance等接口进行数据均匀划分。
- 根据数据处理大小,设置“taskmanager.network.numberOfBuffers”缓存buffer数据块的量。
- 优化业务逻辑,减少计算量和IO操作。提前过滤不必要的数据,尽量重用内存空间,避免重复计算。
- JVM的GC内存
- GC的配置:在客户端的“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” |
- 资源参数配置
- core:heap_memory=1:4,即1个核对应4G内存。例如:
- core参数值为1CU,heap memory参数值为3G,则最终资源分配结果的是1CU+4G。
- core参数值为1CU,heap memory参数值为5G,则最终资源分配结果的是1.25CU+5G
- core:heap_memory=1:4,即1个核对应4G内存。例如:
- 优化DataStream操作
- 实时程序优化DataStream的数据分区或分组操作。 当分区导致数据倾斜时,需要考虑优化分区。
- 避免非并行度操作,有些对DataStream的操作会导致无法并行,例如WindowAll。
- keyBy尽量不要使用String。
- 并行度
- 增加任务的并行度,充分利用集群机器的计算能力,一般并行度设置为集群CPU核数总和的2-3倍。
- Source的个数和上游Partition数量有关。例如,Source的个数是16,Source的并发数可以为16、8或4等,不得超过16。(Source的并发数不能大于Source的分区数)
- 算子设置并行度:一个算子、数据源和sink的并行度可以通过调用setParallelism()方法来指定
- 执行环境设置并行度:Flink程序运行在执行环境中。执行环境为所有执行的算子、数据源、data sink定义了一个默认的并行度,执行环境的默认并行度可以通过调用setParallelism()方法指定。
- 客户端提交时设置并行度:并行度可以在客户端将job提交到Flink时设定。对于CLI客户端,可以通过“-p”参数指定并行度。
- 在系统配置文件中设置:在flink-conf.yaml中,设置parallelism.default参数
- 任务参数配置
- 在使用yarn-session命令时,添加“-jm MEM”参数设置内存
- 在使用yarn-cluster命令时,添加“-yjm MEM”参数设置内存
- 在使用yarn-session命令时,添加“-n NUM”参数设置TaskManager个数
- 在使用yarn-cluster命令时,添加“-yn NUM”参数设置TaskManager个数
- 在使用yarn-session命令时,添加“-p NUM”参数设置SLOT数
- 在使用yarn-cluster命令时,添加“-yp NUM”参数设置SLOT数
- 将在使用yarn-sesion命令时,添加“-tm MEM”参数设置内存
- 将在使用yarn-cluster命令时,添加“-ytm MEM”参数设置内存
- 分区设置
- 随机分区:将元素随机地进行分区。dataStream.shuffle()
- 基于round-robin对元素进行分区,使得每个分区负责均衡。解决存在数据倾斜的情况:dataStream.rebalance();
- 使用round-robin将元素分区到下游操作的子集中。当想将数据从一个源的每个并行实例中分发到一些mappers的子集中,用来分散负载,但是又不想要完全分区负载均衡:dataStream.rescale();
- 广播每个元素到所有分区:dataStream.broadcast();
- 自定义分区:用自定义的Partitioner对每个元素选择的目标task,按照某个特征进行分区,从而优化任务执行
- 检查点设置
https://ververica.cn/developers/introduction-to-state-management-and-fault-tolerance/
- flink状态
https://ververica.cn/developers/flink-state-best-practices/
- 官方参数配置与调优: