1.Flink对接kafka出现数据倾斜
- 问题现象
使用FlinkKafkaProducer进行数据生产过程中数据只写到了kafka的部分分区中,其它的分区没有数据写入。
可能原因1:Flink写kafka使用的机制与原生接口的写入方式是有差别的,在默认情况下,Flink使用了并行度编号和分区数量做取模运算计算出来。那么会有以下两种场景:
1. 并行度%分区数量=0,表示并行度是kafkatopic分区数的多倍,数据的写入每个分区数据量是均衡的。
2. 并行度%分区数量≠0,那么数据量势必会在每个分区上的数据量产生倾斜。
- 解决方案
- 调整kafka的分区数跟flink的并行度保持一致,这种配置要求kafka的分区数跟flink写kafka的sink并行度保持强一致性,好处在于每个并行度仅需要跟每个kafka分区所在的broker保持一个常链接即可。能够节省线程与分区之间调度的时间和并且节省内存空间
- 将生产侧的分区策略写成随机写入模式,如下图:
这样数据会随即写入kafka的所有分区中,但是会有一部分时间损耗在线程向寻址分区这个过程中。建议使用解决方案1。
可能原因2:
在部分算子中使用了keyby()方法,由于现网中的