flink提交任务参数

网上参数众说纷纭不切实际

  1. 提交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即可。

 

  1. 调优
  1. 提高cpu使用率同时减少额外性能开销
  1. 根据业务模型,设置合适的垃圾收集器,通过分析GC日志,设置合理的分区大小,GC线程并发度,减少full gc操作。
  2. 设置合理的TaskManager数量和每个TaskManager对应的slot数量,使每个节点上的有合理的任务并行度,注意slot数量不宜太高,避免线程的额外开销。
  3. 在算子中设置partition数量,防止内存不足GC。
  4. 防止数据倾斜,可以使用rebalance等接口进行数据均匀划分。
  5. 根据数据处理大小,设置“taskmanager.network.numberOfBuffers”缓存buffer数据块的量。
  6. 优化业务逻辑,减少计算量和IO操作。提前过滤不必要的数据,尽量重用内存空间,避免重复计算。

 

  1. JVM的GC内存
  1. 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”

 

  1. 资源参数配置
    1. core:heap_memory=1:4,即1个核对应4G内存。例如:
      • core参数值为1CU,heap memory参数值为3G,则最终资源分配结果的是1CU+4G。
      • core参数值为1CU,heap memory参数值为5G,则最终资源分配结果的是1.25CU+5G
  2. 优化DataStream操作
  1. 实时程序优化DataStream的数据分区或分组操作。 当分区导致数据倾斜时,需要考虑优化分区。
  2. 避免非并行度操作,有些对DataStream的操作会导致无法并行,例如WindowAll。
  3. keyBy尽量不要使用String。
  1. 并行度
    1. 增加任务的并行度,充分利用集群机器的计算能力,一般并行度设置为集群CPU核数总和的2-3倍。
    2. Source的个数和上游Partition数量有关。例如,Source的个数是16,Source的并发数可以为16、8或4等,不得超过16。(Source的并发数不能大于Source的分区数)
    3. 算子设置并行度:一个算子、数据源和sink的并行度可以通过调用setParallelism()方法来指定
    4. 执行环境设置并行度:Flink程序运行在执行环境中。执行环境为所有执行的算子、数据源、data sink定义了一个默认的并行度,执行环境的默认并行度可以通过调用setParallelism()方法指定。
    5. 客户端提交时设置并行度:并行度可以在客户端将job提交到Flink时设定。对于CLI客户端,可以通过“-p”参数指定并行度。
    6. 在系统配置文件中设置:在flink-conf.yaml设置parallelism.default参数
  2. 任务参数配置
    1. 在使用yarn-session命令时,添加“-jm MEM”参数设置内存
    2. 在使用yarn-cluster命令时,添加“-yjm MEM”参数设置内存
    3. 在使用yarn-session命令时,添加“-n NUM”参数设置TaskManager个数
    4. 在使用yarn-cluster命令时,添加“-yn NUM”参数设置TaskManager个数
    5. 在使用yarn-session命令时,添加“-p NUM”参数设置SLOT
    6. 在使用yarn-cluster命令时,添加“-yp NUM”参数设置SLOT
    7. 将在使用yarn-sesion命令时,添加“-tm MEM”参数设置内存
    8. 将在使用yarn-cluster命令时,添加“-ytm MEM”参数设置内存
  3. 分区设置
  1. 随机分区:将元素随机地进行分区。dataStream.shuffle()
  2. 基于round-robin对元素进行分区,使得每个分区负责均衡。解决存在数据倾斜的情况:dataStream.rebalance();
  3. 使用round-robin将元素分区到下游操作的子集中。当想将数据从一个源的每个并行实例中分发到一些mappers的子集中,用来分散负载,但是又不想要完全分区负载均衡:dataStream.rescale();
  4. 广播每个元素到所有分区:dataStream.broadcast();
  5. 自定义分区:用自定义的Partitioner对每个元素选择的目标task,按照某个特征进行分区,从而优化任务执行
  1. 检查点设置

https://ververica.cn/developers/introduction-to-state-management-and-fault-tolerance/

 

  1. flink状态

https://ververica.cn/developers/flink-state-best-practices/

  1. 官方参数配置与调优:
  1. https://ci.apache.org/projects/flink/flink-docs-release-1.12/zh/deployment/config.html
  1. https://ci.apache.org/projects/flink/flink-docs-release-1.12/zh/deployment/memory/mem_tuning.html

 

猜你喜欢

转载自blog.csdn.net/qq_34387470/article/details/115366459