1

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

我有一个水槽代理配置为使用 spooldir 源从该目录读取并使用MorphlineSolrSink.

水槽代理抛出以下异常

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 应用程序没有完成它的编写。

我该如何解决这个问题?

编辑

我不知道这些信息是否有价值。这些配置以前可以正常工作,没有任何问题。我们在运行水槽的机器上遇到了硬桌面故障。从该故障中恢复后,水槽会引发此异常。

4

2 回答 2

2

如有关以下内容的文档中所述Spooling Directory Source

为了换取这种可靠性,只有不可变的、唯一命名的文件必须放入假脱机目录。Flume 尝试检测这些问题条件,如果违反它们,将会大声失败:

  • 如果一个文件在放入 spooling 目录后被写入,Flume 将在其日志文件中打印一个错误并停止处理。
  • 如果稍后重用文件名,Flume 将在其日志文件中打印错误并停止处理。

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

于 2015-04-27T13:46:52.270 回答
1

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

于 2016-11-11T11:43:20.957 回答