我已经开发了一个Flink程序,该程序从Twitter读取推文并将其推到Kafka上。然后它将卡夫卡的推文取回来并进行处理。
“推文处理”转换从推文文本中提取主题标签和用户,并在默认输出中发送它们,并在侧面输出中发送它们的每一对。
附件图像是从Flink Web UI中选取的。我不明白为什么将Kafka Source和Tweets处理运算符合并到一个任务中,主要是我希望Tweets接收器从Kafka Source接收所有原始Tweet,而不是Tweets处理运算符的输出。
程序正确吗?
这是代码的相关部分:
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");
答案 0 :(得分:0)
您正在使用tweetsStream
创建两个不同的数据流。第一个是tweetsAggregator
,第二个是termsStream
。然后,再次从termsStream创建两个不同的数据流:counts
和edgesStream
。接收器运算符没有输出。因此它不能生成数据给另一个运算符,并且它必须是最后一个要使用的运算符。您必须从数据源运算符addSource(myConsumer)
开始,链接所需的任意数量的转换timeWindowAll
,aggregate
,map
,keyBy
,然后调用接收器运算符。如果需要,可以调用多个接收器,但请记住,接收器不会生成数据流给其他运算符,它们是使用者。