我有一个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代理开始处理文件。
如何解决此问题?
我不知道这些信息是否有价值。 这些配置之前没有任何问题。我们在运行水槽的机器上遇到了硬桌面故障。从失败中恢复后,水槽抛出了这个异常。
答案 0 :(得分:1)
如关于Spooling Directory Source
的文档中所述:
作为这种可靠性的交换,只有不可变的,唯一命名的文件 必须放入假脱机目录。 Flume试图检测 这些问题的条件如果被违反就会大声失败:
- 如果在放入假脱机目录后写入文件,Flume会在其日志文件中输出错误并停止 处理强>
- 如果文件名稍后重复使用,Flume会在其日志文件中输出错误并停止处理。
我建议您的Java应用程序将 buckets 数据转储到临时文件中;通过添加创建的时间戳来命名它们。 bucket 已满(即达到特定大小)后,将文件移至假脱机目录。
答案 1 :(得分:1)
将源文件写入另一个目录,然后将(mv命令)文件移动到假脱机源目录。它应该工作。不要使用复制命令。