Flume java.lang.IllegalStateException:文件自读取后已更改大小

时间:2015-04-27 13:00:59

标签: java flume flume-ng

我有一个java应用程序,它从不同的源收集数据并将输出写入特定目录下的文件。

我有一个flume代理配置为使用spooldir源从该目录读取并使用MorphlineSolrSink将输出写入Solr。

水槽代理抛出以下异常

java.lang.IllegalStateException: File has changed size since being read

以下是水槽剂的配置

agent02.sources = s1
agent02.sinks = solrSink
agent02.channels = ch1

agent02.channels.ch1.type = file
agent02.channels.ch1.checkpointDir=/home/flume/prod_solr_chkpoint/file-channel/checkpoint
agent02.channels.ch1.dataDirs= /home/flume/prod_solr_chkpoint/file-channel/data

agent02.sources.s1.type = spooldir
agent02.sources.s1.channels = ch1

agent02.sources.s1.spoolDir = /DataCollection/json_output/solr/
agent02.sources.s1.deserializer.maxLineLength = 100000

agent02.sinks.solrSink.type = org.apache.flume.sink.solr.morphline.MorphlineSolrSink
agent02.sinks.solrSink.channel = ch1
agent02.sinks.solrSink.batchSize = 10000
agent02.sinks.solrSink.batchDurationMillis = 10000
agent02.sinks.solrSink.morphlineFile = morphlines.conf 
agent02.sinks.solrSink.morphlineId = morphline

我从异常中理解的是,当java应用程序没有完成编写时,flume代理开始处理文件。

如何解决此问题?

修改

我不知道这些信息是否有价值。 这些配置之前没有任何问题。我们在运行水槽的机器上遇到了硬桌面故障。从失败中恢复后,水槽抛出了这个异常。

2 个答案:

答案 0 :(得分:1)

如关于Spooling Directory Source的文档中所述:

  

作为这种可靠性的交换,只有不可变的,唯一命名的文件   必须放入假脱机目录。 Flume试图检测   这些问题的条件如果被违反就会大声失败:

     
      
  • 如果在放入假脱机目录后写入文件,Flume会在其日志文件中输出错误并停止   处理
  •   
  • 如果文件名稍后重复使用,Flume会在其日志文件中输出错误并停止处理。
  •   

我建议您的Java应用程序将 buckets 数据转储到临时文件中;通过添加创建的时间戳来命名它们。 bucket 已满(即达到特定大小)后,将文件移至假脱机目录。

答案 1 :(得分:1)

将源文件写入另一个目录,然后将(mv命令)文件移动到假脱机源目录。它应该工作。不要使用复制命令。