1.keyBy之前发生数据倾斜
如果keyBy之前就存在数据倾斜,上游算子的某些实例可能处理的数据较多,某些实例可能处理的数据较少,产生该情况可能是因为数据源的数
据本身就不均匀,例如由于某些原因Kafka的topic中某些partition的数据量较大,某些partition的数据量较少。对于不存在keyBy的Flink任务也
会出现该情况。
这种情况,需要让Flink任务强制进行shuffle。使用shuffle、rebalance、rescale算子即可将数据均匀分配,从而解决数据倾斜的问题。
2.keyBy之后无开窗聚合数据倾斜
map端使用状态先预聚合,达到一定时间或者一定size后再同一输出(localkeyby)。
3.keyBy后的窗口聚合操作存在数据倾斜
因为使用了窗口,变成了有界数据的处理,窗口默认是触发时才会输出一条结果发往下游,所以可以使用两阶段聚合的方式:
第一阶段聚合:key拼接随机数前缀或后缀,进步keyby、开窗、聚合。
第二阶段聚合:去掉随机数前缀或后缀,按照原来的key及windowEnd作keyby、聚合。