在我们的场景下,除了有批量写入降低 IO 的需求,对数据延迟也需要控制,当 key set 太大时,每个 key 累积指定数据条数的时间将增加,会导致数据写入的延迟增大,因此我们需要控制 key set 的大小。经过分析,当 key set 较小时,Flink 默认的数据分发策略在并发间分布不均,从而导致了上述数据倾斜的问题。下面我们从源码级别对此进行说明。
首先,Flink 为了保证从 state 中恢复数据时产生最小的 IO,引入了 key group 的概念。Key group 数目等于最大并发数(max parallelism),取值范围是 128-32768。当做数据分发的时候,key 会按照规则被分发到 key group 里面,相关代码如下所示: