【问题标题】:Apache Flink: What's the difference between side outputs and split() in the DataStream API?Apache Flink:DataStream API 中的侧输出和 split() 有什么区别?
【发布时间】:2018-07-20 10:37:06
【问题描述】:

Apache Flink 有一个 split API 允许分支数据流:

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

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

它还提供了另一种称为侧输出 (https://ci.apache.org/projects/flink/flink-docs-release-1.5/dev/stream/side_output.html) 的方法,可以让您做同样的事情!

这两种方式有什么区别?他们使用的是同一个较低级别的结构吗?它们的成本一样吗?我们应该何时以及如何选择其中之一?

【问题讨论】:

    标签: apache-flink flink-streaming


    【解决方案1】:

    split 运算符自早期以来就是 DataStream API 的一部分。稍后添加的侧输出功能并提供split 功能的超集。

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

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

    side output 的一个常见用例是过滤掉无效(或迟到的)记录,并将它们未经修改地传递给 side,例如,稍后处理它们。这样的操作符有一个带有所需结果类型的常规输出和一个带有其输入类型的侧输出。使用split 来实现这个逻辑会很麻烦。

    【讨论】:

    • 据我所知,侧输出是一种更灵活的方式,运行时成本相同!我说的对吗?
    【解决方案2】:

    splitside outputs 之间的一个重要区别是 split is deprecated 而不是侧面输出。

    引用自 Flink 的splitmanual

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

    【讨论】:

      猜你喜欢
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 2023-03-16
      • 2014-03-01
      • 1970-01-01
      • 2012-05-04
      相关资源
      最近更新 更多