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

Flume java.lang.IllegalStateException:文件读取后大小已更改,java,flume,flume-ng,Java,Flume,Flume Ng,我有一个java应用程序,它从不同的来源收集数据,并将输出写入特定目录下的文件 我有一个flume代理,配置为使用spooldir source读取该目录,并使用MorphlineSolrSink将输出写入Solr flume代理抛出以下异常 java.lang.IllegalStateException: File has changed size since being read 下面是flume代理的配置 agent02.sources = s1 agent02.sinks = solr

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

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

flume代理抛出以下异常

java.lang.IllegalStateException: File has changed size since being read
下面是flume代理的配置

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
我从这个异常中了解到,flume代理开始处理一个文件,而java应用程序并没有完成它的编写

我如何解决这个问题

编辑 我不知道这些信息是否有价值。
这些配置以前都可以正常工作。我们在运行水槽的机器上遇到了一个硬桌面故障。从失败中恢复后,flume抛出此异常

如文件中所述:

作为这种可靠性的交换,只有不可变的、唯一命名的文件 必须放入假脱机目录。水槽试图探测 如果违反这些条件,这些问题将出现,并将大声失效:

  • 如果文件在放入假脱机目录后写入,Flume将在其日志文件中打印错误并停止 处理。
  • 如果以后重新使用文件名,Flume将在其日志文件中打印错误并停止处理

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

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

我不太确定,但我猜flume只能处理已完成的文件,这意味着您应该将该文件写入另一个文件夹,然后将其自动移动到代理正在读取的文件夹中。