关于flume中file had been modified since being read以及File has changed size since being read解决办法

  2018年新年新气象,前段时间软考成绩出来了,没想到一次就过了,,,,运气还好,新的一年继续努力,好了不扯淡进入正题。。。。
  
  之前用flume搬运测试数据,出现了一些问题,使用的是spooldir来监听服务器上指定目录的文件夹,监控里面的文件,一旦出现新的文件,就将其搬运到kafka指定的topic,这个被监控的目录有些要求,不能出现同名文件,否则flume会挂掉,里面的文件一旦出现也不能在做任何修改,比如文件的大小和修改时间一旦修改也会报错,也就是上面报的错误。

  当时想了三种方案,这里记录一下:

  方案一是创建了一个有几十万条的测试数据的文件,然后指定每隔几秒将该文件取出1000条数据写入一个文件扔到flume监听的目录,这种情况存在一个弊端,就是在搬运过程中可能1000条数据还没有完全写入指定目录就已经被flume监听到之后就搬运走了,这时候会在flume重新生成以该时间戳命名的文件,导致文件名重复挂掉,所以这种方案pass

  方案二是为了确保一个文件完全写完以后搬运到flume,设置一个中间目录,编写一个shell脚本用来监听这个中间目录,如果该目录中存在指定格式的文件,比如.csv或者.json文件,就将其搬运到flume监听的目录,同时修改代码将以时间戳命名的文件后缀暂时写成.tmp,当指定1000条数据完全写入该.tmp文件以后将其后缀改为实际需要的格式,比如csv或者json格式,这时候负责监听该目录的shell脚本会把里面的文件搬运到flume监听的目录,本来以为这样能解决上面的问题,结果忽略了一点,如果这里生成的一个1000条数据的文件比较大,那么在拷贝过程中就已经被flume监听发现,记录了此时的修改时间和文件大小,此时文件没有拷贝完就记录了,当真正拷贝完修改时间和文件大小都被修改了与一开始的记录不同,所以会报上面的错

  以上两种方案都有问题,所以想到另外一种方案,既然无论如何都存在搬运时差就直接放在flume监听的目录,只不过在一个文件未写完1000条数据的时候将后缀改为指定格式.COMPLETED,这样的文件会被flume认为已经搬运了,当写完数据后将后缀.COMPLETED去掉,这样flume就会监听到该文件对其进行搬运,而此时文件的大小和修改时间都已经固定不变了,那么之前报错的两个问题文件被修改或者文件大小被改变也就不会出现了。事实采用这第三种方式确实可以,不过这里会报一个其他错,但是不影响flume搬运可以忽略不计。

  以上记录一下思路仅供参考。

你可能感兴趣的:(flume)