flume java.lang.illegalstateexception:文件读取后大小已更改

vh0rcniy  于 2021-06-04  发布在  Flume
关注(0)|答案(2)|浏览(570)

我有一个java应用程序,它从不同的来源收集数据,并将输出写入特定目录下的文件。
我有一个flume代理,配置为使用spooldir source读取该目录,并使用 MorphlineSolrSink .
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抛出这个异常。

4szc88ey

4szc88ey1#

如文件中所述 Spooling Directory Source :
作为这种可靠性的交换,只有不可变的、唯一命名的文件必须被放到假脱机目录中。flume尝试检测这些问题条件,如果违反这些条件,将大声失败:
如果一个文件在放入假脱机目录后被写入,flume将在其日志文件中打印一个错误并停止处理。
如果文件名在以后被重用,flume会将错误打印到其日志文件并停止处理。
我建议您的java应用程序将大量数据转储到临时文件中;通过添加创建的时间戳来命名它们。一旦存储桶已满(即达到一定大小),则将文件移动到假脱机目录。

7xzttuei

7xzttuei2#

将源文件写入另一个目录,然后将(mv命令)文件移动到spool源目录。应该有用。不要使用复制命令。

相关问题