Flink 优化-数据倾斜
一、判断是否存在数据倾斜
相同 Task 的多个 SubTask 中,个别 SubTask 接收到的数据量明显大于其他 SubTask 接收到的数据量,通过 Flink Web UI 可以精确地看到每个 SubTask 处理了多少数据,即可判断出 Flink 任务是否存在数据倾斜。通常数据倾斜也会引起反压。

另外,有时 Checkpoint detail 里不同的 SubTask 的 State size 也是一个分析数据倾斜的有用指标。
二、数据倾斜的解决方案
2.1 keyBy 之前发生数据倾斜
如果 keyBy 之前就存在数据倾斜,上有算子的某些实例可能处理的数据较多,某些实例可能处理的数据较少,产生该情况可能是因为数据源的数据本身就不均匀,例如某些原因 kafka 的 topic 中某些 partition 的数据量较大,某些 partition 的数据量较小。对于不存在 keyBy 的 Flink 任务也会出现这种情况。这时需要然 Flink 任务强制进行 shuffle。使用 shuffle、rebalance 或 rescale 算子即可将数据均匀分配,从而解决数据倾斜的问题。
2.2 keyBy 后的聚合操作存在数据倾斜
查看 Web UI,情况如下:

2.2.1 为什么不能直接用二次聚合来处理?
