我正在尝试构建一个数据流处理系统,我希望聚合最后一分钟从我的传感器发送的数据。传感器在sensor
主题中将数据发送到Kafka服务器,并由Flink使用。
我正在使用带有KafkaPython库的Python生成器,我以JSON格式发送数据。在JSON中,theres是包含时间戳的字段sent
。这个参数是使用int(datetime.now().timestamp())
每10秒在Python中生成的,我知道这些参数以秒为单位返回一个unix格式的时间戳。
问题是系统什么都没打印!我做错了什么?
// set up the execution environment
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
// setting topic and processing the stream from Sensor
DataStream<Sensor> sensorStream = env.addSource(new FlinkKafkaConsumer010<>("sensor", new SimpleStringSchema(), properties))
.flatMap(new ParseSensor()) // parsing into a Sensor object
.assignTimestampsAndWatermarks(new AscendingTimestampExtractor<Sensor>() {
@Override
public long extractAscendingTimestamp(Sensor element) {
return element.getSent()*1000;
}
});
sensorStream.keyBy(meanSelector).window(TumblingEventTimeWindows.of(Time.minutes(1))).apply(new WindowMean(dataAggregation)).print();
在我尝试完成这项工作的过程中,我发现方法.timeWindow()
而不是.window()
有效!更精确的是,我写了.timeWindow(Time.minutes(1))
。
N.B。:尽管Flink跑了5分钟,窗口只打印了一次!