Flink 数据倾斜
问题描述
数据集中在某几个特定分区上,导致每个节点数据处理严重不平稳。可能会导致
- Flink Web UI 自带的反压监控。


注意:只用用户在访问点击某一个作业时,才会触发日出反压状态的计算。在默认的设置下,Flink 的 TaskManager 会每隔 50ms 触发一次反压状态监测,共监测 100 次,并将计算结果反馈给 JobManager,最后由 JobManager 进行计算反压的比例,然后进行展示:
| Ratio | Status | Describe |
|---|---|---|
| 0 <= Ratio <= 0.10 | OK | 正常 |
| 0.10 < Ratio <= 0.5 | LOW | 一般 |
| 0.5 < Ratio <= 1 | HIGH | 严重 |
- 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 占用很高,说明已经受到下游算子的反压影响,自己的数据发送限速。
outPoolUsage 和 inPoolUsage 同为低或高分别表示当前 task 正常或处于被下游反压。如果 outPoolUsage 和 inPoolUsage 表现不同,说明有可能处于反压传导的中间状态,或者该 task 就是反压的根源。
除了以上指标外,Flink 1.9 后还提供更丰富用于监控 Flink 反压状态:
常来说,floatingBuffersUsage 为高则表明反压正在传导至上游,而 exclusiveBuffersUsage 则表明了反压是否存在倾斜(floatingBuffersUsage 高、exclusiveBuffersUsage 低为有倾斜,因为少数 channel 占用了大部分的 Floating Buffer)。
优化方案
KeyProcessor的分区数选择为质数,因为质数取余后分布更均匀。- 两阶段聚合,总-分-总。
