dataStream.map(func1).keyBy("key") //(1)
.process(func2).keyBy("key") //(2)
.timeWindow().aggregate(func3).addSink(sink)
方法process()不会更改记录的field(key)值。假设所有运算符的并行度是2,(2)处的keyBy()是否还会导致网络混乱?也许由于(2)的keyBy()由于密钥值不变,所以具有转发策略的效果,从而避免了网络通信成本?]
非常感谢〜
keyBy总是很昂贵,因为它迫使记录通过ser / de。但是在通信是本地通信的情况下(即在同一任务槽内),Flink将使用共享缓冲区通信序列化的字节,而不是遍历整个netty tcp堆栈。所以是的,在您的情况下,第二个keyBy比第一个便宜。但是我不会说成本很小。
[如果您知道完全不需要keyBy,则可以使用reinterpretAsKeyedStream重新获得KeyedStream
,而无需承担任何开销。