Flink 运维与调优

本文详细介绍了Flink的运维与调优,涵盖了内存设置、并行度计算、RocksDB调优、Checkpoint配置、使用ParameterTool读取配置等多个方面,旨在帮助开发者提升Flink任务的性能和稳定性。内容包括最佳实践和具体参数调整策略,例如通过调整并行度以平衡负载,优化RocksDB以改善磁盘I/O,以及设置合理的Checkpoint间隔等。
摘要由CSDN通过智能技术生成

转载-flink优化_黄瓜炖啤酒鸭的博客-CSDN博客

1.1 内存设置 

1.2 并行度设置 

1.2.1 最优并行度计算 

1.2.2 Source 端并行度的配置 

1.2.3 Transform端并行度的配置 

1.2.4 Sink 端并行度的配置 

1.3 RocksDB大状态调优 

1.4 Checkpoint设置 

1.5 使用 Flink ParameterTool 读取配置 

1.5.1 读取运行参数 

1.5.2 读取系统属性 

1.5.3 读取配置文件 

1.5.4 注册全局参数 

1.6 压测方式 

2 反压处理 

2.1 反压现象及定位 

2.1.1 利用 Flink Web UI 定位产生反压的位置 

2.1.2 利用Metrics定位反压位置 

2.2 反压的原因及处理 

2.2.1 系统资源 

2.2.2 垃圾收集(GC) 

2.2.3 CPU/线程瓶颈 

2.2.4 线程竞争 

2.2.5 负载不平衡 

2.2.6 外部依赖 

3 数据倾斜 

3.1 判断是否存在数据倾斜 

3.2 数据倾斜的解决 

3.2.1 keyBy 后的聚合操作存在数据倾斜 

3.2.2 keyBy 之前发生数据倾斜 

3.2.3 keyBy 后的窗口聚合操作存在数据倾斜 

4 KafkaSource调优 

4.1 动态发现分区 

4.2 从kafka数据源生成watermark 

4.3 设置空闲等待 

4.4 Kafka的offset消费策略 

5 FlinkSQL调优 

5.1 Group Aggregate优化 

5.1.1 开启MiniBatch(提升吞吐) 

5.1.2 开启LocalGlobal(解决常见数据热点问题) 

5.1.3 开启Split Distinct(解决COUNT DISTINCT热点问题) 

5.1.4 改写为AGG WITH FILTER语法(提升大量COUNT DISTINCT场景性能) 

5.2 TopN优化 

5.2.1 使用最优算法 

5.2.2 无排名优化(解决数据膨胀问题) 

5.2.3 增加TopN的Cache大小 

5.2.4 PartitionBy的字段中要有时间类字段 

5.2.5 优化后的SQL示例 

5.3 高效去重方案 

5.3.1 保留首行的去重策略(Deduplicate Keep FirstRow) 

5.3.2 保留末行的去重策略(Deduplicate Keep LastRow) 

5.4 高效的内置函数 

5.4.1 使用内置函数替换自定义函数 

5.4.2 LIKE操作注意事项 

5.4.3 慎用正则函数(REGEXP) 

5.5 指定时区 

5.6 设置参数总结 


  1. 资源配置调优

Flink性能调优的第一步,就是为任务分配合适的资源,在一定范围内,增加资源的分配与性能的提升是成正比的,实现了最优的资源配置后,在此基础上再考虑进行后面论述的性能调优策略。

提交方式主要是yarn-per-job,资源的分配在使用脚本提交Flink任务时进行指定。

  • 标准的Flink任务提交脚本(Generic CLI 模式)

从1.11开始,增加了通用客户端模式,参数使用-D <property=value>指定

bin/flink run \

-t yarn-per-job \

-d \

-p 5 \ 指定并行度

-Dyarn.application.queue=test \ 指定yarn队列

-Djobmanager.memory.process.size=1024mb \ 指定JM的总进程大小

-Dtaskmanager.memory.process.size=1024mb \ 指定每个TM的总进程大小

-Dtaskmanager.numberOfTaskSlots=2 \ 指定每个TM的slot数

-c com.at.app.dwd.LogBaseApp \

/opt/module/gmall-flink/gmall-realtime-1.0-SNAPSHOT-jar-with-dependencies.jar

参数列表:

Apache Flink 1.12 Documentation: Configuration


    1. 内存设置

生产资源配置:

bin/flink run \

-t yarn-per-job \

-d \

-p 5 \ 指定并行度

-Dyarn.application.queue=test \ 指定yarn队列

-Djobmanager.memory.process.size=2048mb \ JM2~4G足够

-Dtaskmanager.memory.process.size=6144mb \ 单个TM2~8G足够

-Dtaskmanager.numberOfTaskSlots=2 \ 与容器核数1core:1slot或1core:2slot

-c com.at.app.dwd.LogBaseApp \

/opt/module/gmall-flink/gmall-realtime-1.0-SNAPSHOT-jar-with-dependencies.jar

Flink是实时流处理,关键在于资源情况能不能抗住高峰时期每秒的数据量,通常用QPS/TPS来描述数据情况。

  1. 并行度设置

    1. 最优并行度计算

开发完成后,先进行压测。任务并行度给10以下,测试单个并行度的处理上限。然后 总QPS/单并行度的处理能力 = 并行度

不能只从QPS去得出并行度,因为有些字段少、逻辑简单的任务,单并行度一秒处理几万条数据。而有些数据字段多,处理逻辑复杂,单并行度一秒只能处理1000条数据。

最好根据高峰期的QPS压测,并行度*1.2倍,富余一些资源。


  1. Source 端并行度的配置

数据源端是 Kafka,Source的并行度设置为Kafka对应Topic的分区数。

如果已经等于 Kafka 的分区数,消费速度仍跟不上数据生产速度,考虑下Kafka 要扩大分区,同时调大并行度等于分区数。

Flink 的一个并行度可以处理一至多个分区的数据,如果并行度多于 Kafka 的分区数,那么就会造成有的并行度空闲,浪费资源。


  • Transform端并行度的配置
  • Keyby之前的算子

一般不会做太重的操作,都是比如map、filter、flatmap等处理较快的算子,并行度可以和source保持一致。

  • Keyby之后的算子

如果并发较大,建议设置并行度为 2 的整数次幂,例如:128、256、512;

小并发任务的并行度不一定需要设置成 2 的整数次幂;

大并发任务如果没有 KeyBy,并行度也无需设置为 2 的整数次幂;


  1. Sink 端并行度的配置

Sink 端是数据流向下游的地方,可以根据 Sink 端的数据量下游的服务抗压能力进行评估。如果Sink端是Kafka,可以设为Kafka对应Topic的分区数。

Sink 端的数据量小,比较常见的就是监控告警的场景,并行度可以设置的小一些。

Source 端的数据量是最小的,拿到 Source 端流过来的数据后做了细粒度的拆分,数据量不断的增加,到 Sink 端的数据量就非常大。那么在 Sink 到下游的存储中间件的时候就需要提高并行度。

另外 Sink 端要与下游的服务进行交互,并行度还得根据下游的服务抗压能力来设置,如果在 Flink Sink 这端的数据量过大的话,且 Sink 处并行度也设置的很大,但下游的服务完全撑不住这么大的并发写入,可能会造成下游服务直接被写挂,所以最终还是要在 Sink 处的并行度做一定的权衡。

  1. RocksDB大状态调优

RocksDB 是基于 LSM Tree 实现的(类似HBase),写数据都是先缓存到内存中,所以RocksDB 的写请求效率比较高。RocksDB 使用内存结合磁盘的方式来存储数据,每次获取数据时,先从内存中 blockcache 中查找,如果内存中没有再去磁盘中查询。优化后差不多单并行度 TPS 5000 record/s,性能瓶颈主要在于 RocksDB 对磁盘的读请求,所以当处理性能不够时,仅需要横向扩展并行度即可提高整个Job 的吞吐量。以下几个调优参数:

  • 设置本地 RocksDB 多目录

在flink-conf.yaml 中配置:

state.backend.rocksdb.localdir: /data1/flink/rocksdb,/data2/flink/rocksdb,/data3/flink/rocksdb

注意:不要配置单块磁盘的多个目录,务必将目录配置到多块不同的磁盘上,让多块磁盘来分担压力。当设置多个 RocksDB 本地磁盘目录时,Flink 会随机选择要使用的目录,所以就可能存在三个并行度共用同一目录的情况。如果服务器磁盘数较多,一般不会出现该情况,但是如果任务重启后吞吐量较低,可以检查是否发生了多个并行度共用同一块磁盘的情况。

当一个 TaskManager 包含 3 个 slot 时,那么单个服务器上的三个并行度都对磁盘造成频繁读写,从而导致三个并行度的之间相互争抢同一个磁盘 io,这样务必导致三个并行度的吞吐量都会下降。设置多目录实现三个并行度使用不同的硬盘从而减少资源竞争。

如下所示是测试过程中磁盘的 IO 使用率,可以看出三个大状态算子的并行度分别对应了三块磁盘,这三块磁盘的 IO 平均使用率都保持在 45% 左右,IO 最高使用率几乎都是 100%,而其他磁盘的 IO 平均使用率相对低很多。由此可见使用 RocksDB 做为状态后端且有大状态的频繁读取时, 对磁盘IO性能消耗确实比较大。

如下图所示,其中两个并行度共用了 sdb 磁盘,一个并行度使用 sdj磁盘。可以看到 sdb 磁盘的 IO 使用率已经达到了 91.6%,就会导致 sdb 磁盘对应的两个并行度吞吐量大大降低,从而使得整个 Flink 任务吞吐量降低。如果每个服务器上有一两块 SSD,强烈建议将 RocksDB 的本地磁盘目录配置到 SSD 的目录下,从 HDD 改为 SSD 对于性能的提升可能比配置 10 个优化参数更有效

  • state.backend.incremental:开启增量检查点,默认false,改为true。
  • state.backend.rocksdb.predefined-options:SPINNING_DISK_OPTIMIZED_HIGH_MEM设置为机械硬盘+内存模式,有条件上SSD,指定为FLASH_SSD_OPTIMIZED
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值