我可以使用带有groupby的自定义分区器吗?

63lcw9qa  于 2021-06-21  发布在  Flink
关注(0)|答案(1)|浏览(301)

假设我知道我的数据集是不平衡的,我知道密钥的分布。我想利用它来编写一个自定义分区器,以最大限度地利用操作符示例。
我知道datastream#partitioncustom。然而,如果我的流是键控的,它仍然可以正常工作吗?我的工作看起来像:

KeyedDataStream afterCustomPartition = keyedStream.partitionCustom(new MyPartitioner(), MyPartitionKeySelector())

DataStreamUtils.reinterpretAsKeyedStream(afterCustomPartition, new MyGroupByKeySelector<>()).sum()

我想要达到的是:
根据某个键拥有一个流keyby,这样reduce函数只能用该键中的元素调用。
该组根据一些自定义分区将工作拆分到多个节点上。
自定义分区根据并行操作符示例的数量返回一个数字(将是固定的,不受重缩放限制)。
自定义分区从keyby返回不同的值。然而, keyBy(x) = keyBy(y) => partition(x) = partition(y) .
在分区之前具有预聚合以最小化网络流量。
用例示例:
数据集:[(0,a)、(0,b)、(0,c)、(1,d)、(2,e)]
并行运算符示例数:2
groupby函数:返回该对的第一个元素
分区函数:为键0返回0,为键1和2返回1。优点:处理可能将键0和1发送到同一个操作符示例的数据倾斜,这意味着一个操作符示例将接收80%的数据集。

4nkexdtk

4nkexdtk1#

不幸的是,这是不可能的。 DataStreamUtils.reinterpretAsKeyedStream() 要求对数据进行相同的分区,就像调用 keyBy() .
此限制的原因是键组以及如何将键Map到键组。键组是Flink表示键控状态分布的单位。键组的数目决定了运算符的最大并行度,并用 setMaxParallelism() . 密钥通过内部哈希函数分配给密钥组。通过更改密钥的分区,同一密钥组的密钥将分布在多台无法工作的机器上。
为了调整对机器的密钥分配,您需要更改对密钥组的密钥分配。但是,没有一个公共的或可访问的接口来做到这一点。因此,flink1.6不支持自定义密钥分发。

相关问题