Flink
批处理时,遇到一个场景:flink在分析日志文件时,如果日志文件已经存在,flink则会正确读取并分析日志文件。这里问什么说正确读取呢?假设,日志文件很大,大到100M,在慢网络情况下,将日志文件发送到slave节点分析,那么,是不是会存在这么一种情况,文件还在传输,而flink程序却已发现有新日志文件,并将其转移到了工作目录进行下一步分析。那结果是不是,程序正在分析的文件,只是部分日志文件,得到的结果,也只是一部分,不准确的结果呢?所以这种情况下就需要知道,该文件是不是正在传输中,如果不是,则拿走分析,如果是,则继续等待传输结束。下面的方法,则是过一定时间,去检查一下,文件是否有新内容写入,在正常网络下,写入状态是不间断的,如果当前文件内容长度与上一次检查的文件长度一样,并没有改变,则判断该文件已传输完成。方法如下,仅供借鉴。当然还有其他方法可行,仁者见仁,智者见智了。
public static boolean checkFileWritingOn(String fileName) throws Exception{
long oldLen = 0;
long newLen = 0;
File file = new File(fileName);
while(true){
newLen = file.length();
if ((newLen - oldLen) > 0) {
oldLen = newLen;
System.out.println(file.length());
Thread.sleep(10000);
} else {
System.out.println("done");
return true;
}
}
}