Apache flink kafka源流上的事件时间窗口

Apache flink kafka源流上的事件时间窗口,apache-flink,flink-streaming,Apache Flink,Flink Streaming,卡夫卡服务器中有一个主题。在程序中,我们将此主题作为流读取并分配事件时间戳。然后在此流上执行窗口操作。但是这个程序不起作用。调试后,似乎没有执行WindowOperator的processWatermark方法。这是我的密码 DataStream广告=env .addSource(新的FlinkKafkaConsumer082(“广告”,新的SimpleStringSchema(),属性)) .map(新的映射函数(){ 私有静态最终长serialVersionUID=-656449500575

卡夫卡服务器中有一个主题。在程序中,我们将此主题作为流读取并分配事件时间戳。然后在此流上执行窗口操作。但是这个程序不起作用。调试后,似乎没有执行WindowOperator的processWatermark方法。这是我的密码

DataStream广告=env
.addSource(新的FlinkKafkaConsumer082(“广告”,新的SimpleStringSchema(),属性))
.map(新的映射函数(){
私有静态最终长serialVersionUID=-6564495005753073342L;
@凌驾
公共元组2映射(字符串值)引发异常{
字符串[]splits=value.split(“”);
返回新的Tuple2(拆分[0],Long.parseLong(拆分[1]);
}
}).分配时间戳(时间抽取器);
广告
.keyBy(按键选择器)
.window(TumblingTimeWindows.of(Time.of(10,TimeUnit.SECONDS)))
.apply(新的WindowFunction(){
私有静态最终长serialVersionUID=5151607280638477891L;
@凌驾
公共void apply(字符串s、时间窗口、Iterable值、收集器out)引发异常{
out.collect(Iterables.size(值));
}
}).print();

为什么会这样?如果在“assignTimestamps(timestampExtractor)”之前添加“keyBy(keySelector)”,则程序可以工作。任何人都可以解释原因吗?

您受到Flink中一个已知错误的影响:

问题是,FlinkKafkaConsumer的运行量(很可能是CPU核数(比如4))比分区(1)多。只有一个卡夫卡消费者在发射水印,其他消费者在空转


窗口操作员没有意识到这一点,正在等待来自所有消费者的水印。这就是windows从不触发的原因。

您的主题“广告”有多少个分区?Flink程序的并行性是什么?该主题只有一个分区,我没有在程序中设置并行性。不确定,我认为Flink中有一个已知的缺陷,它包含水印和卡夫卡源,当并行性高于分区数时。您能否将
StreamExecutionEnvironment
的并行度设置为1(只是看看它是否工作)。谢谢您的帮助。这是因为你提到的这个bug。你能回答这个问题吗?我会把它标为正确答案。谢谢