dataStream.map(func1).keyBy("key") //(1)
.process(func2).keyBy("key") //(2)
.timeWindow().aggregate(func3).addSink(sink)
方法process((不会更改记录的字段(键(值。假设所有运算符的并行度都是2,那么(2(处的keyBy((是否也会导致网络洗牌?也许(2(处的keyBy((由于键值不变而具有避免网络通信成本的正向策略的效果?
太多了~
keyBy总是很昂贵,因为它强制记录通过ser/de。但是,如果通信是本地的,即在同一个任务槽内,那么Flink将使用共享缓冲区来通信序列化的字节,而不是通过整个netty tcp堆栈。是的,在你的情况下,第二个keyBy比第一个便宜。但我不会说成本很小。
如果您知道keyBy是完全不必要的,那么您可以使用reexplateAsKeyedStream重新获得KeyedStream
,而不需要任何开销。