我知道密钥的分布。我想利用它来编写自定义分区器以充分利用运算符实例。
我知道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
按功能分组:返回该对的第一个元素
分区函数:为密钥0返回0,为密钥1和2返回1.优点:处理可能将密钥0和1发送到同一运算符实例的数据偏差,这意味着一个运算符实例将接收80%的数据集。
这是不可能的。DataStreamUtils.reinterpretAsKeyedStream()要求对数据进行相同的分区,就像调用一样keyBy()。
此限制的原因是密钥组以及密钥如何映射到密钥组。关键组是Flink关键状态分布的单位。密钥组的数量决定了运营商的最大并行度,并配置了setMaxParallelism()。密钥分配给具有内部散列函数的密钥组。通过更改密钥的分区,同一密钥组的密钥将分布在多台计算机上,这些计算机将无法运行。
为了调整键到机器的分配,您需要将键的分配更改为键组。但是,没有公共或可访问的界面来做到这一点。因此,Flink 1.6不支持自定义密钥分发。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。