Flink keyby 在未更改的同一字段上是否会导致洗牌?
Does Flink keyby on the same field which isn't changed cause a shuffle?
dataStream.map(func1).keyBy("key") //(1)
.process(func2).keyBy("key") //(2)
.timeWindow().aggregate(func3).addSink(sink)
方法process() 不改变记录的字段(键)值。假设所有算子的并行度都是2,那么(2)处的keyBy()是否也会导致网络shuffle?或许(2)处的keyBy()有前向策略的作用,避免了key值不变导致的网络通信开销?
非常感谢~
keyBy 总是很昂贵,因为它强制记录通过 ser/de。但是在本地通信的情况下——即在同一个任务槽中——然后 Flink 将使用共享缓冲区来通信序列化字节,而不是通过整个 netty tcp 堆栈。所以是的,在您的情况下,第二个 keyBy 比第一个便宜。但我不会说成本小。
如果您知道 keyBy 完全没有必要,您可以使用 reinterpretAsKeyedStream 重新获得 KeyedStream
,而无需任何开销。
dataStream.map(func1).keyBy("key") //(1)
.process(func2).keyBy("key") //(2)
.timeWindow().aggregate(func3).addSink(sink)
方法process() 不改变记录的字段(键)值。假设所有算子的并行度都是2,那么(2)处的keyBy()是否也会导致网络shuffle?或许(2)处的keyBy()有前向策略的作用,避免了key值不变导致的网络通信开销?
非常感谢~
keyBy 总是很昂贵,因为它强制记录通过 ser/de。但是在本地通信的情况下——即在同一个任务槽中——然后 Flink 将使用共享缓冲区来通信序列化字节,而不是通过整个 netty tcp 堆栈。所以是的,在您的情况下,第二个 keyBy 比第一个便宜。但我不会说成本小。
如果您知道 keyBy 完全没有必要,您可以使用 reinterpretAsKeyedStream 重新获得 KeyedStream
,而无需任何开销。