我遇到了一个问题,即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, ...)