Apache Flink:DataStream API中的侧输出(side outputs)和split()有什么区别?

8

Apache Flink 提供了一个 split API,可以将数据流分支:

val splited = datastream.split { i => i match {
   case i if ... => Seq("red", "blue")
   case _ => Seq("green")
}}

splited.select("green").flatMap { .... }

它还提供了另一种方法称为Side Output(https://ci.apache.org/projects/flink/flink-docs-release-1.5/dev/stream/side_output.html),让您做同样的事情!这两种方式有什么区别?它们使用相同的低级结构吗?它们的成本相同吗?我们应该在何时以及如何选择它们之一?
2个回答

10

split运算符自早期开始就是DataStream API的一部分。后来添加了边缘输出特性,提供了split功能的超集。

split创建多个相同类型(即输入类型)的流。侧边输出可以是任何类型,即也可以与输入和主输出不同。

在内部,split添加专用的运算符以仅拆分流。侧边输出在运算符内部定义(通常为ProcessFunction或窗口运算符),应用任意逻辑并具有多个输出。我不会预计这会导致显着的性能差异。

侧边输出的常见用例是过滤无效(或迟到)记录并将它们不经修改地传递到侧面,例如稍后处理它们。这样的运算符具有所需结果类型的常规输出和其输入类型的侧边输出。使用split实现此逻辑将很麻烦。


那么,据我所知,边输出是一种更灵活的方式,其运行时间成本相同!我是对的吗? - Reza Same'ei
@Fabian:有没有办法在没有ProcessFunction或window运算符的情况下使用它?例如:假设用例是 - 根据条件从一个源流式传输数据到多个接收器。即 - 现在sideOutput支持的中间逻辑没有任何键(此处)-没有keyBy、Process、CoProcess等。如何为这种特定情况实现旁路输出? - Jaya Ananthram

3

split侧边输出之间的一个重要区别在于split已被弃用,而侧边输出则没有。

Flink的split手册中引用:

split(OutputSelector<T> outputSelector)
Deprecated. 
Please use side output instead.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接