dataStream.map(func1).keyBy("key") //(1)
.process(func2).keyBy("key") //(2)
.timeWindow().aggregate(func3).addSink(sink)
方法process()不会更改记录的字段(键)值。假设所有操作符的并行度为2,那么(2)处的keyby()是否也会导致网络洗牌?可能(2)处的keyby()具有转发策略的效果,避免了由于键值不变造成的网络通信开销?
太多了~
dataStream.map(func1).keyBy("key") //(1)
.process(func2).keyBy("key") //(2)
.timeWindow().aggregate(func3).addSink(sink)
方法process()不会更改记录的字段(键)值。假设所有操作符的并行度为2,那么(2)处的keyby()是否也会导致网络洗牌?可能(2)处的keyby()具有转发策略的效果,避免了由于键值不变造成的网络通信开销?
太多了~
1条答案
按热度按时间k7fdbhmy1#
keyby总是很昂贵的,因为它强制记录通过ser/de。但是如果通信是本地的(即,在同一个任务槽中),那么flink将使用共享缓冲区来通信序列化的字节,而不是通过整个netty tcp堆栈。是的,在你的情况下,第二把钥匙比第一把便宜。但我不会说成本很小。
如果您知道keyby是完全不必要的,那么可以使用reinterpretaskeyedstream重新创建一个
KeyedStream
同样没有任何开销。