• 22、Flink 解决数据倾斜问题


    Flink 解决数据倾斜问题
    一、判断是否存在数据倾斜

    相同 Task 的多个 SubTask 中,个别 SubTask 接收到的数据量明显大于其他 SubTask 接收到的数据量,通过 Flink Web UI 可以精确地看到每个 Subtask 处理了多少数据,即可判断出 Flink 任务是否存在数据倾斜

    通常,数据倾斜也会引起反压。

    在这里插入图片描述

    另外, Checkpoint detail 里不同 SubTask 的 State size 也是一个分析数据倾斜的有用指标。
    二、数据倾斜解决方案
    1)keyBy 后的聚合操作存在数据倾斜
    1.不能直接用二次聚合来处理

    如果 keyby 之后的聚合操作存在数据倾斜,且没有开窗口(没攒批)的情况下,使用两阶段聚合,是不能解决问题的。

    因为 Flink 是来一条处理一条,向下游发送一条结果,对于原来 keyby 的维度(第二阶段聚合)来讲,数据量并没有减少,且结果重复计算(非 FlinkSQL,未使用回撤流)。

    2.使用 LocalKeyBy 的思想

    在 keyBy 上游算子数据发送之前,首先在上游算子的本地对数据进行聚合后,再发送到下游,使下游接收到的数据量大大减少,从而使得 keyBy 之后的聚合操作不再是任务的瓶颈。

    类似 MapReduce 中 Combiner 的思想,但是这要求聚合操作必须是多条数据或者一批数据才能聚合,单条数据没有办法通过聚合来减少数据量。

    从 LocalKeyBy 实现原理来讲,必然会存在一个积攒批次的过程,在上游算子中攒够一定的数据量,对这些数据聚合后再发送到下游。

    3.实现方式

    DataStream API :在 keyBy 之前开窗口做预聚合聚合;

    FlinkSQL API:开启 miniBatch 和 LocalGlobal 功能

    2)keyBy 之前发生数据倾斜

    如果 keyBy 之前就存在数据倾斜,上游算子的某些实例可能处理的数据较多,某些实例可能处理的数据较少,产生该情况可能是因为数据源的数据本身就不均匀,例如由于某些原因 Kafka 的 topic 中某些 partition 的数据量较大,某些 partition 的数据量较少。

    对于不存在 keyBy 的 Flink 任务也会出现该情况。

    方案:使用 shuffle、rebalance 或 rescale 算子即可将数据均匀分配,从而解决数据倾斜的问题。

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

    因为使用了窗口,变成了有界数据(攒批)的处理,窗口默认是触发时才会输出结果发往下游,可以使用两阶段聚合的方式。

    方案

    第一阶段聚合:key 拼接随机数前缀或后缀,进行 keyby、开窗、聚合

    注意:聚合完不再是 WindowedStream,要获取 WindowEnd 作为窗口标记作为第二阶段分组依据,避免不同窗口的结果聚合到一起

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

  • 相关阅读:
    安全防御——防火墙二
    计算机毕业设计ssm社区流浪动物救助系统2r32k系统+程序+源码+lw+远程部署
    Android 中的权限
    .Net Core使用Coravel实现任务调度
    基于信通院 Serverless 工具链模型的实践:Serverless Devs
    ElasticSearch7.3学习(二十二)----Text字段排序、Scroll分批查询场景解析
    自阿里 P8 爆出 1031 道 java 面试题后,我在 某直聘狂拿千份 Offer
    R语言和医学统计学(7):多元线性回归
    打造无证服务化:这个政务服务平台有点不一样
    苹果Mac电脑fcpx视频剪辑:Final Cut Pro中文最新 for mac
  • 原文地址:https://blog.csdn.net/m0_50186249/article/details/132760668