第一次质疑。我对Apache Flink有疑问。 为了衡量Apache Flink的每个并行数的延迟性能,我们希望总计创建窗口与为每个窗口发出该窗口之间的时间差。
延迟是通过使用水印触发器在Window的构造函数中定义的system.currenttimemillis ()
和public long start_time
计算的,但是对于窗口宽度而言,该值相当大。
由于这种怪异,我认为Flink正在重用Window。实际发生了什么?
此外,即使窗口的start_time在触发器侧被替换,它也没有被更改。 这应该怎么办?
此外,如果您有更好的方法来衡量Window的生存时间,请告诉我,我将不胜感激。
(如果Flink正在重新使用该窗口,则将再次使用废弃窗口的start_time
。)
private static class MyTrigger extends Trigger<Tuple2<Integer,Integer>,MyTimeWindow>{
File ratency_file;
MyTrigger(){
super();
try{
ratency_file = new File(ratency_filePath);
FileWriter filewriter = new FileWriter(ratency_file,false);
filewriter.close();
}catch(IOException e){
System.out.println("IOException");
}
}
@Override
public TriggerResult onElement(Tuple2<Integer,Integer> element, long timestamp, MyTimeWindow window, Trigger.TriggerContext ctx) throws IOException {
if (window.maxTimestamp() <= ctx.getCurrentWatermark()) {
// if the watermark is already past the window fire immediately
int index = (int)(System.currentTimeMillis()-window.start_time);
FileWriter filewriter = new FileWriter(ratency_file,true);
filewriter.write(Integer.toString(index)+"\n");
filewriter.close();
return TriggerResult.FIRE_AND_PURGE;
} else {
ctx.registerEventTimeTimer(window.maxTimestamp());
return TriggerResult.CONTINUE;
}
}
@Override
public TriggerResult onEventTime(long time, MyTimeWindow window, Trigger.TriggerContext ctx) throws IOException {
TriggerResult res = time == window.maxTimestamp() ? TriggerResult.FIRE_AND_PUREGE : TriggerResult.CONTINUE;
if( res == TriggerResult.FIRE_AND_PURGE ){
int index = (int)(System.currentTimeMillis()-window.start_time);
FileWriter filewriter = new FileWriter(ratency_file,true);
filewriter.write(Integer.toString(index)+"\n");
filewriter.close();
}
return res;
}
@Override
public void clear(MyTimeWindow window, Trigger.TriggerContext ctx) throws IOException{
ctx.deleteEventTimeTimer(window.maxTimestamp());
}
@Override
public TriggerResult onProcessingTime(long timestamp, MyTimeWindow window , Trigger.TriggerContext ctx){
TriggerResult res = TriggerResult.CONTINUE;
return res;
}
}
答案 0 :(得分:0)
您正在使用事件时间窗口,并且当窗口准备关闭时,通过计算System.currentTimeMillis()-window.start_time
可以将许多不同的延迟源混合在一起。
到达水印的事件时间窗口超过窗口的结尾时,将触发事件时间窗口。假设BoundedOutOfOrderness水印生成器不会发生,除非事件到达的时间戳大于窗口的结束时间加上您为适应无序事件而配置的延迟。此外,水印不会在此类事件到来时立即创建,而是在自动水印间隔到期时立即创建。
将所有这些放在一起,您正在测量的延迟包括许多看起来可能很大的事情:
window.start_time
是基于事件中的时间戳,您正在将其与System.currentTimeMillis()
进行比较)