假设我知道我的数据集是不平衡的,我知道密钥的分布。我想利用它来编写自定义分区器以充分利用运算符实例。
我知道DataStream#partitionCustom。但是,如果我的流是键控的,它仍然可以正常工作吗?我的工作看起来像:
KeyedDataStream afterCustomPartition = keyedStream.partitionCustom(new MyPartitioner(), MyPartitionKeySelector())
DataStreamUtils.reinterpretAsKeyedStream(afterCustomPartition, new MyGroupByKeySelector<>()).sum()
我想要实现的是:
keyBy(x) = keyBy(y) => partition(x) = partition(y)
在分区之前最小化网络流量。用例示例:
遗憾的是,这是不可能的。 pre-aggregation要求对数据进行相同的分区,就像调用DataStreamUtils.reinterpretAsKeyedStream()
一样。
此限制的原因是密钥组以及密钥如何映射到密钥组。关键组是Flink关键状态分布的单位。键组的数量决定了运算符的最大并行度,并使用keyBy()
进行配置。密钥分配给具有内部散列函数的密钥组。通过更改密钥的分区,相同密钥组的密钥将分布在多台计算机上,这些计算机将无法运行。
为了调整键到机器的分配,您需要将键的分配更改为键组。但是,没有公共或可访问的界面来做到这一点。因此,Flink 1.6不支持自定义密钥分发。