Flink数据倾斜优化 FlinkSql及FlinkDataStream

一.现象及解决

1).现象:相同 Task 的多个 Subtask 中,个别 Subtask 接收到的数据量明显大于其他 Subtask 接收到的数据量,通过Flink Web U1 可以精确地看到每个 Subtask 处理了多少数据,即可判断出 Flink 任务是否存在数据倾斜。通常,数据倾斜也会引起反压。

2).解决

(1)数据源倾斜

比如消费 katka,但是 katka 的 topic 的分区之间数据不均衡读进来之后调用重分区算子:rescale、rebalance、shuffle,

(2)单表分组聚合(纯流式)倾斜

API:利用 fatmmap 攒批、预聚合

SQL:开启 MiniBatch+LocalGloba

(3)单表分组开窗聚合倾斜第一阶段聚合

key 拼接随机数前缀或后缀,进行keyby、开窗、聚合注意:聚合完不再是 WindowedStream,要获取 WimndowEnd 作为窗口标记作为第二阶段分组依据,避免不同窗口的结果聚合到一起)

第二阶段聚合:按照原来的 key 及 windowEnd 作 keyby、聚合

在项目中,用到 clickhouse,可以第一阶段打散聚合后,直接写入 clickhouse,查 clickhouse 再处理第二阶段

二.FlinkSQL中数据倾斜怎样产生的?怎样解决?

1).产生:在编写FlinkSQL中数据分布不均衡、key值分布不均、JOIN关联键分布不均、JOIN表大小差异大、窗口操作问题、并行度不当、数据动态的变化都会导致FlinkSQL在编写过程中造成数据倾斜。

2).解决:

数据准备阶段    (数据预处理)

  • 数据采样与分析:在正式处理数据之前,对数据进行采样分析,了解数据的分布情况,包括数据量大小、Key 的取值分布等。通过分析可以提前发现可能导致数据倾斜的因素,如某些 Key 的取值过于集中等,为后续的处理提供依据。
  • 数据均衡处理:根据数据采样分析的结果,对数据进行必要的均衡处理。如果发现数据在某个维度上分布不均匀,可以采用一些数据预处理技术,如对数据进行重新分区、打散等操作,使数据在进入 Flink SQL 处理流程之前尽量均匀分布。

SQL 语句优化

  • 合理设计 JOIN 操作
    • 选择合适的 JOIN 类型:根据参与 JOIN 的表的特点和业务需求,选择合适的 JOIN 类型。例如,当一张表较小且可以完全加载到内存中时,可以考虑使用广播 JOIN(Broadcast JOIN),将小表广播到所有节点,避免数据 shuffle,从而减少数据倾斜的可能性。
    • 优化 JOIN 条件:确保 JOIN 条件的合理性,避免使用过于复杂或容易导致数据倾斜的关联条件。如果可能,可以对 JOIN 条件进行调整,使关联键的分布更加均匀。
  • 优化 GROUP BY 操作:在使用 GROUP BY 进行分组聚合时,尽量选择分布均匀的列作为分组依据。如果无法避免使用分布不均匀的列,可以考虑对这些列进行预处理,如通过添加随机前缀或后缀等方式对 Key 进行打散,使数据在分组时能够更加均匀地分布到不同的分组中。
  • 谨慎使用窗口操作:在使用窗口函数时,要根据数据的特点和业务需求合理设置窗口大小和滑动步长。如果数据在时间或其他维度上存在明显的不均匀分布,可以考虑采用动态窗口或自适应窗口,根据数据的实际情况动态调整窗口的划分,避免固定窗口导致的数据倾斜。

系统配置优化

  • 合理设置并行度:根据数据量大小、数据分布情况以及集群资源等因素,合理设置 Flink 作业的并行度。一般来说,可以通过性能测试和调优等手段,找到一个合适的并行度,使数据能够均匀地分配到各个任务中进行处理。同时,可以考虑使用自适应并行度调整策略,根据作业的负载情况自动调整并行度。
  • 优化资源分配:确保集群中各节点的资源分配均匀合理,避免因资源差异导致任务调度不均衡而产生数据倾斜。可以根据节点的性能和资源情况,对任务进行合理的分配,或者使用一些资源调度算法,使资源分配更加科学。

监控与动态调整

  • 实时监控作业状态:在 Flink SQL 作业运行过程中,通过 Flink 的监控系统实时监控作业的运行状态,包括数据处理速度、各任务的负载情况、数据倾斜情况等。一旦发现数据倾斜问题,及时进行分析和处理。

  • 动态调整策略:根据监控结果,动态调整作业的相关参数和策略。例如,当发现某个任务出现数据倾斜时,可以动态调整该任务的并行度,或者对数据进行重新分区等操作,及时缓解数据倾斜问题。

总结:针对不同场景下的FlinkSQL做出的优化

三.FlinkDataStream怎样产生的数据倾斜?如何解决?

1).产生:

数据源不均匀使数据本身的特性及数据采集问题存在差异、Key分布不均匀造成业务逻辑分组处理不均、窗口大小和滑动步长设置不当导致少量集中引发数据倾斜、特定时间段会造成数据热点问题导致数据集中从而引发数据倾斜、JOIN关联键分布不均及维表数据倾斜也会造成数据倾斜、任务并行设置和并行度的设置不均。以上问题可能会导致数据倾斜。

2).解决:

数据预处理

  • 均匀采样与打散:在数据进入 Flink 处理流程前,对数据进行均匀采样和打散处理。例如,对于按用户 ID 分区的数据,如果发现某些用户的数据量特别大,可以对这些用户的数据进行随机采样,然后将采样后的数据与其他用户的数据混合均匀。
  • 过滤掉无效数据:在数据源头对明显异常或无效的数据进行过滤,减少不必要的数据处理,避免这些数据对整体数据分布的影响。

优化 Key 的选择与分布

  • 选择更合适的 Key:在进行分组或关联操作时,仔细分析数据特点,选择分布更均匀的 Key。如果以用户 ID 作为 Key 导致数据倾斜,可以考虑根据业务规则构造新的 Key,如对用户 ID 进行哈希取模后再分组。
  • 加盐处理:对于 Key 分布不均匀的情况,可以通过在 Key 上添加随机前缀或后缀的方式进行 “加盐”,使数据在分区时更加均匀。

调整窗口设置

  • 合理设置窗口大小和滑动步长:根据数据的流量和业务需求,调整窗口的大小和滑动步长,避免大量数据集中在少数几个窗口中。
  • 动态调整窗口:根据数据的实时流量和分布情况,动态调整窗口的大小和滑动步长,以适应数据的变化。

优化 Join 操作

  • 广播小表:如果 Join 操作中的一张表数据量较小,可以将其广播到所有节点,避免数据在网络传输过程中的倾斜。
  • 调整 Join 策略:根据数据的特点和分布情况,选择合适的 Join 策略,如 Hash Join、Sort-Merge Join 等。

合理设置并行度

  • 根据数据量和处理能力设置并行度:通过分析数据量的大小和系统的处理能力,合理设置任务的并行度,确保每个并行任务处理的数据量相对均衡。
  • 动态调整并行度:在作业运行过程中,根据数据的实时流量和处理情况,动态调整任务的并行度,以提高系统的资源利用率和处理效率。

总结: 

 

 

四.总结

 总而言之解决数据倾斜 1).提升性能(减少任务的执行时间、提高资源利用率)2).稳定性增强(避免人数失败、减少背压和反压) 3).降低成本(软件资源成本、运维成本)  4).结果准确性提高(避免数据丢失或重复计算)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值