在大数据处理领域,数据倾斜是一个非常常见的问题,今天我们就简单讲讲在flink中如何处理流式数据倾斜问题。
我们先来看一个可能产生数据倾斜的sql.
select TUMBLE_END(proc_time, INTERVAL '1' MINUTE) as winEnd,plat,count(*) as pv from source_kafka_table
group by TUMBLE(proc_time, INTERVAL '1' MINUTE) ,plat
在这个sql里,我们统计一个网站各个端的每分钟的pv,从kafka消费过来的数据首先会按照端进行分组,然后执行聚合函数count来进行pv的计算。如果某一个端产生的数据特别大,比如我们的微信小程序端产生数据远远大于其他app端的数据,那么把这些数据分组到某一个算子之后,由于这个算子的处理速度跟不上,就会产生数据倾斜。
查看flink的ui,会看到如下的场景。
对于这种简单的数据倾斜,我们可以通过对分组的key加上随机数,再次打散,分别计算打散后不同的分组的pv数,然后在最外层再包一层,把打散的数据再次聚合,这样就解决了数