Flink Side Outputs

Side Output 功能从 Flink 1.3.0 版本开始提供,FLINK-4460

除了从 DataStream 操作的结果中获取主数据流之外,还可以产生任意数量额外的旁路输出(side output)结果流。旁路输出的数据类型不需要与主数据流的类型一致,不同旁路输出的类型也可以不同。当你想要拆分数据流时(通常需要复制流),然后从每个流过滤出不需要的数据,此操作将非常有用。

当使用旁路输出时,首先需要定义一个 OutputTag 对象,用来标识一个旁路输出流:

// 这需要是一个匿名的内部类,以便我们分析类型
OutputTag<String> outputTag = new OutputTag<String>("side-output") {};

注意 OutputTag 是如何根据旁路输出流所包含的元素类型进行类型化的。可以通过以下函数将数据发送到旁路输出:

  • ProcessFunction(1.3.x)
  • KeyedProcessFunction(1.8.x)
  • CoProcessFunction(1.4.x)
  • KeyedCoProcessFunction(1.9.x)
  • ProcessWindowFunction(1.4.x)
  • ProcessAllWindowFunction(1.4.x)

可以使用 Context (在上述函数中会向用户提供使用)将数据发送到由 OutputTag 标识的旁路输出。下面的例子是在 ProcessFunction 中发出旁路输出数据:

DataStream<Integer> input = ...;

final OutputTag<String> outputTag = new OutputTag<String>("side-output"){};

SingleOutputStreamOperator<Integer> mainDataStream = input
  .process(new ProcessFunction<Integer, Integer>() {

      @Override
      public void processElement(
          Integer value,
          Context ctx,
          Collector<Integer> out) throws Exception {
        // 发送数据到主要的输出
        out.collect(value);

        // 发送数据到旁路输出
        ctx.output(outputTag, "sideout-" + String.valueOf(value));
      }
    });

要获取旁路输出流,可以在 DataStream 上调用 getSideOutput(OutputTag) 来获取,如下面的例子:

final OutputTag<String> outputTag = new OutputTag<String>("side-output"){};

SingleOutputStreamOperator<Integer> mainDataStream = ...;

DataStream<String> sideOutputStream = mainDataStream.getSideOutput(outputTag);

推荐阅读更多精彩内容

  • Side Output 功能从 Flink 1.3.0 版本开始提供,FLINK-4460 除了从 DataStr...
    Alex90阅读 4,406评论 0 0
  • 除了从DataStream操作的结果中获取主数据流之外,你还可以产生任意数量额外的侧输出结果流。侧输出结果流的数据...
    写Bug的张小天阅读 12,250评论 0 7
  • 前言 转换算子是无法访问事件的时间戳信息和水位线信息的。而这在一些应用场景下,极为重要。例如MapFunction...
    Rex_2013阅读 2,841评论 0 1
  • 1.Flink API介绍 Flink提供了不同的抽象级别以开发流式或者批处理应用程序 Stateful Stre...
    Rex_2013阅读 956评论 0 2
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 7,952评论 28 53