Apache Flink:如何处理三个流

时间:2018-11-08 02:47:44

标签: apache-flink flink-streaming

我想在一个运算符中接收和处理三个流。例如,在 Storm 中实现的代码如下:

builder.setBolt("C_bolt", C_bolt(), parallelism_hint) .fieldsGrouping("A_bolt", "TRAINING", new Fields("word")) .fieldsGrouping("B_bolt", "ANALYSIS", new Fields("word")) .allGrouping("A_bolt", "SUM");

Flink 中,实现了SUM stream(A_bolt's SideOutput)TRAINING stream(A_bolt)的处理:

SingleOutputStreamOperator<Tuple3<String, Integer, Boolean>> A_bolt;
DataStream<Tuple2<Integer, Integer>> Sum = A_bolt.getSideOutput(outputTag).broadcast();
DataStream<Tuple3<String, String, Integer>> B_bolt;
DataStream<String> C_bolt= A_bolt
                        .keyBy(new KeySelector<Tuple3<String,Integer,Boolean>, String>() {
                                    @Override
                                    public String getKey(Tuple3<String,Integer,Boolean> in) throws Exception {
                                        return in.f0;
                                    }
                                })
                        .connect(Sum)
                        .flatMap(new Process())
                        .setParallelism(parallelism);

但是我不知道如何添加ANALYSIS stream(B_bolt)。谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

Flink仅支持一输入和两输入流运算符。您可以选择:

  1. 使用union()创建一个合并的流,其中包含来自所有三个流的所有元素(它们必须具有相同的类型,尽管您可以使用Either进行辅助)。
  2. 在使用coFlatMap合并两个流之后,使用另一个coFlatMap(或coProcessFunction)将初步结果连接到第三流,以完成处理。

或者您最好结合使用这两种技术。