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

时间:2018-07-20 10:37:06

标签: apache-flink flink-streaming

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 个答案:

答案 0 :(得分:2)

split运算符自DataStream API成立之初就是其一部分。侧面输出功能将在以后添加,并提供split功能的超集。

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

在内部,split添加了仅用于分割流的专用运算符。侧面输出在使用任意逻辑并具有多个输出功能的运算符(通常为ProcessFunction或窗口运算符)中定义。我不希望这会导致明显的性能差异。

侧边输出的一个常见用例是过滤掉无效(或较晚)的记录,并将它们未经修改地传递给侧边,例如,稍后再处理它们。这样的运算符具有带有期望结果类型的常规输出和带有其输入类型的侧面输出。使用split来实现此逻辑会很麻烦。

答案 1 :(得分:1)

splitside outputs之间的一个重要区别是 def sort(path): inFile= open(path, 'r') inFile1= open(path, 'r') copy = False outFile = open('mom.txt', 'w') outFile1 = open('dad.txt', 'w') keepCurrentSetDad = False keepCurrentSetMom = False for line in inFile: print("--->",line) if 'Dad' in line: keepCurrentSetDad = True keepCurrentSetMom = False continue elif 'Mom' in line: keepCurrentSetMom = True keepCurrentSetDad = False continue if keepCurrentSetDad: outFile1.write(line) elif keepCurrentSetMom: outFile.write(line) outFile.close() outFile1.close() inFile1.close() is deprecated而侧面输出不是。

Flink的split manual的引用:

split