Apache flink 为什么flink不删除延迟数据?

Apache flink 为什么flink不删除延迟数据?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我正在计算一个简单蒸汽的最大值,结果是: (S11000,S1,值:999) (S12000,S1,值:41) 最后一行数据显然很晚:newsensorreading(“S1”,999,100L) 为什么按第一个窗口(0-1000)计算 我认为第一个窗口应该在SensorReading(“S1”,411000l)到达时启动 我对这个结果感到非常困惑 StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvi

我正在计算一个简单蒸汽的最大值,结果是:

(S11000,S1,值:999)

(S12000,S1,值:41)

最后一行数据显然很晚:
newsensorreading(“S1”,999,100L)

为什么按第一个窗口(0-1000)计算

我认为第一个窗口应该在
SensorReading(“S1”,411000l)
到达时启动

我对这个结果感到非常困惑

StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
环境setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
环境设置并行性(TrainingBase.parallelism);
数据流输入=env.fromElements(
新传感器读数(“S1”,35500L),
新传感器读数(“S1”,42,999L),
新传感器读数(“S1”,41,1000L),
新传感器读数(“S1”,40,1200L),
新传感器读数(“S1”,23,1400L),
新传感器读数(“S1”、999、100L)
);
input.assignTimestampsAndWatermarks(新的AssignerWithPeriodicWatermarks(){
私有长currentMaxTimestamp;
@可空
@凌驾
公共水印getCurrentWatermark(){
返回新水印(currentMaxTimestamp);
}
@凌驾
公共长提取时间戳(SensorReading元素,长先前元素时间戳){
currentMaxTimestamp=element.ts;
返回currentMaxTimestamp;
}
})
.keyBy((KeySelector)值->值.sensorName)
.window(TumblingEventTimeWindows.of(时间秒(1)))
.reduce(新的MyReduceingMax(),新的MyWindowFunction())
.print();
execute();
MyReduceingMax(),MyWindowFunction()

私有静态类MyReduceMax实现ReduceFunction{
公共传感器读数减少(传感器读数r1、传感器读数r2){
返回r1.getValue()>r2.getValue()?r1:r2;
}
}
私有静态类MyWindowFunction扩展
ProcessWindowFunction{
@凌驾
公共无效程序(
字符串键,
语境,
Iterable maxReading,
收集器(输出){
SensorReading max=maxReading.iterator().next();
collect(新的Tuple3(key,context.window().getEnd(),max));
}
}
公共静态课堂阅读{
字符串名称;
int值;
长ts;
公众阅读(){
}
公共传感器读取(字符串传感器名称、int值、长ts){
this.sensorName=sensorName;
这个值=值;
这1.ts=ts;
}
公共长廊{
返回ts;
}
公共无效集合(长集合){
这1.ts=ts;
}
公共字符串getSensorName(){
返回传感器名称;
}
public void setSensorName(字符串sensorName){
this.sensorName=sensorName;
}
public int getValue(){
返回值;
}
公共无效设置值(int值){
这个值=值;
}
公共字符串toString(){
返回this.sensorName+“(“+this.ts+”)值:“+this.value;
}
;
}

具有周期性水印的分配者不会在每个可能的机会都创建水印。相反,Flink会定期调用这样的赋值器来获取最新的水印,默认情况下,这是每200毫秒(实时,而不是事件时间)进行一次。此间隔由控制

这意味着在调用水印赋值器之前,几乎可以肯定已经处理了所有六个测试事件

如果您关心更可预测的水印,可以使用带有标点水印的赋值器


顺便说一句,按照编写水印赋值器的方式,所有无序事件都可能延迟。更典型的做法是使用BoundedAutofordernessTimestampExtractor,它允许出现一些无序情况。

我使用标点水印测试了Assigner,结果成功了,非常感谢!