Flink:了解我程序的数据流

时间:2018-06-30 08:03:11

标签: apache-flink

我已经开发了一个Flink程序,该程序从Twitter读取推文并将其推到Kafka上。然后它将卡夫卡的推文取回来并进行处理。

“推文处理”转换从推文文本中提取主题标签和用户,并在默认输出中发送它们,并在侧面输出中发送它们的每一对。

附件图像是从Flink Web UI中选取的。我不明白为什么将Kafka Source和Tweets处理运算符合并到一个任务中,主要是我希望Tweets接收器从Kafka Source接收所有原始Tweet,而不是Tweets处理运算符的输出。

程序正确吗?

Datalow

这是代码的相关部分:

    FlinkKafkaConsumer010<String> myConsumer = new FlinkKafkaConsumer010<String>(Constants.KAFKA_TWEETS_TOPIC, new SimpleStringSchema(), properties);
    myConsumer.setStartFromLatest();

    DataStream<String> tweetsStream = env
            .addSource(myConsumer)
            .name("Kafka tweets consumer");

    SingleOutputStreamOperator<List<String>> tweetsAggregator = tweetsStream
            .timeWindowAll(Time.seconds(7))
            .aggregate(new StringAggregatorFunction())
            .name("Tweets aggregation");

    DataStreamSink tweetsSink = tweetsAggregator.addSink(new TweetsSink())
            .name("Tweets sink")
            .setParallelism(1);

    SingleOutputStreamOperator<String> termsStream = tweetsStream
            // extracting terms from tweets
            .process(new TweetParse())
            .name("Tweets processing");

    DataStream<Tuple2<String, Integer>> counts = termsStream
            .map(new ToTuple())
            // Counting terms
            .keyBy(0)
            .timeWindow(Time.seconds(13))
            .sum(1)
            .name("Terms processing");

    DataStream<Tuple3<String, String, Integer>> edgesStream = termsStream.getSideOutput(TweetParse.outputTag)
            .map(new ToTuple3())
            // Counting terms pairs
            .keyBy(0, 1)
            .timeWindow(Time.seconds(19))
            .sum(2)
            .name("Edges processing");

1 个答案:

答案 0 :(得分:0)

您正在使用tweetsStream创建两个不同的数据流。第一个是tweetsAggregator,第二个是termsStream。然后,再次从termsStream创建两个不同的数据流:countsedgesStream。接收器运算符没有输出。因此它不能生成数据给另一个运算符,并且它必须是最后一个要使用的运算符。您必须从数据源运算符addSource(myConsumer)开始,链接所需的任意数量的转换timeWindowAllaggregatemapkeyBy,然后调用接收器运算符。如果需要,可以调用多个接收器,但请记住,接收器不会生成数据流给其他运算符,它们是使用者。