Apache Flink基准延迟性能

时间:2020-02-03 10:46:00

标签: java apache-flink

第一次质疑。我对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;
}

}

1 个答案:

答案 0 :(得分:0)

您正在使用事件时间窗口,并且当窗口准备关闭时,通过计算System.currentTimeMillis()-window.start_time可以将许多不同的延迟源混合在一起。

到达水印的事件时间窗口超过窗口的结尾时,将触发事件时间窗口。假设BoundedOutOfOrderness水印生成器不会发生,除非事件到达的时间戳大于窗口的结束时间加上您为适应无序事件而配置的延迟。此外,水印不会在此类事件到来时立即创建,而是在自动水印间隔到期时立即创建。

将所有这些放在一起,您正在测量的延迟包括许多看起来可能很大的事情:

  • 带时间戳记的事件与Flink提取事件之间经过的时间(因为window.start_time是基于事件中的时间戳,您正在将其与System.currentTimeMillis()进行比较)
  • 加水印带来的延迟(以适应乱序事件)
  • 由于自动加水印间隔而延迟(默认值:200毫秒)
  • 网络缓冲延迟(默认值:100毫秒)
  • 窗口持续时间