在Flink中汇总来自Kafka的数据时遇到问题

时间:2018-06-28 12:38:19

标签: java stream apache-kafka apache-flink

我创建了一个简单的Flink应用程序,该应用程序从Kafka主题中读取日志,并将其聚集在一个持续时间为2秒,水印为1秒的窗口中。然后,将结果发送到另一个Kafka主题。该应用程序已部署在群集上。

我像这样食用卡夫卡:

Map<String, String> parameters = new HashMap<String, String>();
    parameters.put("bootstrap.servers", bootstrapServers);
    parameters.put("group.id", groupId);
    parameters.put("zookeeper.connect", zookeeperConnect);
    parameters.put("topic", inputTopic);
    parameters.put("auto.offset.reset", "earliest");

ParameterTool parameterTool = ParameterTool.fromMap(parameters);

return env.addSource(new FlinkKafkaConsumer011<>(parameterTool.getRequired("topic"),
    new SimpleStringSchema(),
    parameterTool.getProperties()));

聚合是通过以下方式进行的:

DataStream<AggregatedMeasures> aggregatedStream = messageStream

    // Extract the timestamp from the object
    .assignTimestampsAndWatermarks(new TimestampExtractor())

    //Key for the Aggregation
    .keyBy(new KeySelector<MeasureData, Tuple2<String, Timestamp>>() {
      @Override
      public Tuple2<String, Timestamp> getKey(MeasureData value) throws Exception {
        return Tuple2.of(value.Id(), value.getEventTimestamp());
      }
    })

    //Set the Time Window Duration
    .timeWindow(Time.seconds(windowDuration))

    //Aggregate
    .aggregate(new AggregateMeasureFunction());

我这样向卡夫卡生产:

producer = new FlinkKafkaProducer011<>(
    bootstrapServers, // broker list
    outputTopic, // target topic
    new AggregatedMeasuresJSONSerializer()); // serialization schema

producer.setWriteTimestampToKafka(true);

messageStream.addSink(producer); // DataStream<AggregatedMeasures>

我在输入主题中生成一百万个日志时对其进行了测试。这个用Python编写的生产者运行缓慢,Flink可以很好地运行。

当我尝试读取已经填充了一百万个日志的相同输入主题时,Flink生产商将读取日志,但不会输出所有结果,仅输出其中的一部分。

是背压吗?我不了解这种行为。

我正在使用Java 8,Flink 1.4和YARN。

0 个答案:

没有答案