KeyedStream 的不平衡处理



我遇到了一个问题,即KeyedStream在worker上完全并行化 对于键数接近并行性的情况

我的输入记录范围为 0-N。当我使用 keyBy 时,有些工作人员处理零个键,有些处理多个键。这是因为KeyGroupRangeAssignment.assignKeyToParallelOperator()KeyGroupStreamPartitioner使用murmurHash来key.hasCode并选择频道。

我知道分区自定义可以处理这种情况,但是分区自定义只返回数据流,不返回键流。

那么我该怎么做才能在没有黑客攻击的情况下进行处理呢?

嗯,这有点像黑客,但请参阅makeKeyForOperatorIndex。我使用了一个自定义RichMapFunction来确定它在open()调用中的子任务索引,然后使用makeKeyForOperatorIndex创建一个键(整数或字符串(,该键作为字段添加,然后用于keyBy()

不幸的是,它有点埋葬,但有一种方法可以将DataStream变成KeyedStream.

DataStream<T> partitioned = input.partitionCustom(...);
KeyedStream<T> keyed = DataStreamUtils.reinterpretAsKeyedStream(partitioned, ...)

最新更新