Flink 数据倾斜

问题描述

数据集中在某几个特定分区上,导致每个节点数据处理严重不平稳。可能会导致

  • 单点问题
  • GC 频繁
  • 整体吞吐量下降
  • 数据延迟增加
  • Checkpoint 超时
  • 系统崩溃

    Flink 反压定位

  1. Flink Web UI 自带的反压监控。

image.png
19001033_61967af9173c392537.png
注意:只用用户在访问点击某一个作业时,才会触发日出反压状态的计算。在默认的设置下,Flink 的 TaskManager 会每隔 50ms 触发一次反压状态监测,共监测 100 次,并将计算结果反馈给 JobManager,最后由 JobManager 进行计算反压的比例,然后进行展示:
image.png

Ratio Status Describe
0 <= Ratio <= 0.10 OK 正常
0.10 < Ratio <= 0.5 LOW 一般
0.5 < Ratio <= 1 HIGH 严重
  1. Flink Task Metrics。

所有的 Flink 监控指标在 这里 展示。

Metrics Describe
outPoolUsage 发送端 Buffer 的使用率
inPoolUsage 接收端 Buffer 的使用率
floatingBuffersUsage(1.9 以上) 接收端 Floating Buffer 的使用率
exclusiveBuffersUsage (1.9 以上) 接收端 Exclusive Buffer 的使用率

其中 inPoolUsage 等于 floatingBuffersUsage 与 exclusiveBuffersUsage 的总和。

反压分析大致思路是:从接收端开始排查,如果接收端的 Receive Buffer 占用很高,则会将反压传导至上游。而发送端的 Send Buffer 占用很高,说明已经受到下游算子的反压影响,自己的数据发送限速。
7681467a110b64d494b9da56925e25d76e83d96f.png
outPoolUsage 和 inPoolUsage 同为低或高分别表示当前 task 正常或处于被下游反压。如果 outPoolUsage 和 inPoolUsage 表现不同,说明有可能处于反压传导的中间状态,或者该 task 就是反压的根源。
除了以上指标外,Flink 1.9 后还提供更丰富用于监控 Flink 反压状态:
3d6a29a6fb130d6337e6f07baf565e02ef3cf80f.png
常来说,floatingBuffersUsage 为高则表明反压正在传导至上游,而 exclusiveBuffersUsage 则表明了反压是否存在倾斜(floatingBuffersUsage 高、exclusiveBuffersUsage 低为有倾斜,因为少数 channel 占用了大部分的 Floating Buffer)。

优化方案

  1. KeyProcessor 的分区数选择为质数,因为质数取余后分布更均匀。
  2. 两阶段聚合,总-分-总。