例如,有一个密钥流:

val keyedStream: KeyedStream[event, Key] = env
    .addSource(...)
    .keyBy(...)

// several transformations on the same stream
keyedStream.map(....)
keyedStream.window(....)
keyedStream.split(....)
keyedStream...(....)


我认为这是Flink中相同流的重用,我发现当我重用它时,流的内容不受其他转换的影响,因此我认为它是同一流的副本。


但我不知道这是否正确。
如果是,这将使用大量资源(哪些资源?)来保存副本?

最佳答案

应用了多个运算符的DataStream(或KeyedStream)将复制所有传出消息。例如,如果您有一个程序,例如:

val keyedStream: KeyedStream[event, Key] = env
  .addSource(...)
  .keyBy(...)

val stream1: DataStream = keyedStream.map(new MapFunc1)
val stream2: DataStream = keyedStream.map(new MapFunc2)


该程序执行为

           /-hash-> Map(MapFunc1) -> ...
 Source >-<
           \-hash-> Map(MapFunc2) -> ...


源复制每个记录,并将其发送给两个下游运算符(MapFunc1MapFunc2)。运算符的类型(在我们的示例Map中)无关紧要。

这样做的代价是通过网络将每个记录发送两次。如果所有接收操作员都具有相同的并行性,则可以通过发送每个记录一次并在接收任务管理器中将其复制来优化它,但是目前尚未完成。

您可以通过添加单个接收运算符(例如,身份映射运算符)和另一个keyBy从中派生到多个接收者来手动优化程序。因为所有记录已经在本地,所以这不会导致网络混乱。但是,所有运算符必须具有相同的并行性。

关于apache-flink - 流的重用是否是流的副本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47750597/

10-13 02:54