我创建了一个简单的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。