我有一个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抛出这个异常。
2条答案
按热度按时间4szc88ey1#
如文件中所述
Spooling Directory Source
:作为这种可靠性的交换,只有不可变的、唯一命名的文件必须被放到假脱机目录中。flume尝试检测这些问题条件,如果违反这些条件,将大声失败:
如果一个文件在放入假脱机目录后被写入,flume将在其日志文件中打印一个错误并停止处理。
如果文件名在以后被重用,flume会将错误打印到其日志文件并停止处理。
我建议您的java应用程序将大量数据转储到临时文件中;通过添加创建的时间戳来命名它们。一旦存储桶已满(即达到一定大小),则将文件移动到假脱机目录。
7xzttuei2#
将源文件写入另一个目录,然后将(mv命令)文件移动到spool源目录。应该有用。不要使用复制命令。