Java ApacheFlink基准测试延迟性能
这是我第一次提问。我有一个关于阿帕奇·弗林克的问题。 为了测量每个并行数的ApacheFlink的延迟性能,我们需要计算创建窗口和为每个窗口发出窗口之间的时间差 使用使用水印触发器的窗口构造函数中定义的Java ApacheFlink基准测试延迟性能,java,apache-flink,Java,Apache Flink,这是我第一次提问。我有一个关于阿帕奇·弗林克的问题。 为了测量每个并行数的ApacheFlink的延迟性能,我们需要计算创建窗口和为每个窗口发出窗口之间的时间差 使用使用水印触发器的窗口构造函数中定义的system.currenttimemillis()和public long start\u time计算延迟,但对于窗口宽度而言,该值相当大。 作为这种奇怪的原因,我认为弗林克是在重复使用窗户。到底发生了什么 此外,即使在触发端替换了窗口的开始时间,也没有改变。 这该怎么办 另外,如果您有更好的
system.currenttimemillis()
和public long start\u time
计算延迟,但对于窗口宽度而言,该值相当大。
作为这种奇怪的原因,我认为弗林克是在重复使用窗户。到底发生了什么
此外,即使在触发端替换了窗口的开始时间,也没有改变。
这该怎么办
另外,如果您有更好的方法来测量窗户的存活时间,如果您能告诉我,我将不胜感激。
(如果Flink正在重新使用该窗口,则将再次使用丢弃窗口的开始时间
。)
私有静态类MyTrigger扩展了触发器{
档案室档案室;
MyTrigger(){
超级();
试一试{
ratency_文件=新文件(ratency_文件路径);
FileWriter FileWriter=新的FileWriter(ratency_文件,false);
filewriter.close();
}捕获(IOE异常){
System.out.println(“IOException”);
}
}
@凌驾
public TriggerResult OneElement(Tuple2元素,长时间戳,MyTimeWindow窗口,Trigger.TriggerContext ctx)引发IOException{
如果(window.maxTimestamp()您正在使用事件时间窗口,并且通过计算System.currentTimeMillis()-window.start\u time
当窗口准备关闭时,您正在混合许多不同的延迟源
当水印到达并通过窗口的结尾时,会触发事件时间窗口。假设使用BoundedAutoForderness水印生成器,则在事件到达时的时间戳大于窗口的结束时间加上您为适应无序事件而配置的延迟之前,不会发生这种情况。此外,水印不会在此类事件到达时立即创建,而是在自动水印间隔到期时创建
综上所述,您正在测量的延迟包括许多看起来相当大的因素:
- 事件加上时间戳和Flink接收事件之间经过的时间(因为
window.start\u time
基于事件中的时间戳,您将其与System.currentTimeMillis()
进行比较)
- 水印施加的延迟(以适应无序事件)
- 自动水印间隔导致的延迟(默认值:200毫秒)
- 网络缓冲延迟(默认值:100毫秒)
- 窗口持续时间
您似乎在这一行有输入错误:TriggerResult res=time==window.maxTimestamp()?TriggerResult.FIRE\u和\u PUREGE:TriggerResult.CONTINUE;
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;
}