ApacheFlink—流的重用是否是流的副本

n6lpvg4x  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(443)

例如,有一个键控流:

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

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

我认为这是flink中对同一个流的重用,我发现当我重用它时,流的内容不受其他转换的影响,所以我认为它是同一个流的副本。
但我不知道这是否正确。
如果是,这将使用大量资源(哪些资源?)来保留副本?

i2byvkas

i2byvkas1#

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) -> ...

源复制每个记录并将其发送给两个下游操作符( MapFunc1 以及 MapFunc2 ). 操作符的类型(在我们的示例Map中)并不重要。
这样做的代价是通过网络将每条记录发送两次。如果所有的接收操作符都具有相同的并行性,那么可以通过发送每个记录一次并在接收任务管理器中复制它来优化它,但是目前还没有这样做。
通过添加单个接收操作符(例如,标识Map操作符)和另一个接收操作符,可以手动优化程序 keyBy 你从中分岔给多个接受者。这不会导致网络洗牌,因为所有记录都已经是本地记录。所有运算符必须具有相同的并行性。

相关问题