flume1.6 spooldir源仅摄取文件的一部分

时间:2016-05-10 10:25:10

标签: java flume

感谢您阅读本文

我正在尝试使用flume-1.6收集日志。但我发现不是全部    使用假脱机导向器源摄取日志文件。请给    你的建议!!

在一次测试中,我在日志文件(170M)中有369,189行,但在另一端只收到169,335行。当我检查flume.log时,它表示已经到达文件末尾并将.COMPLETED添加到原始日志文件中。

我尝试使用不同的日志文件,大约300,000行,另一端收到52,410条记录。

以下是背景和配置:

  1. 日志文件大小各为200M。

  2. 水槽配置了spooldir源,文件通道和kafka接收器,如下所示:

    #agent definition
    log_agent.sources = spooldirSrc 
    log_agent.channels = fileChannel 
    log_agent.sinks = kafkaSink 
    
    log_agent.sources.spooldirSrc.channels = fileChannel
    log_agent.sinks.kafkaSink.channel = fileChannel
    
    # source define
    log_agent.sources.spooldirSrc.type = spooldir
    log_agent.sources.spooldirSrc.spoolDir=/log_path/
    
    
    # kafkaSink definition
    log_agent.sinks.kafkaSink.type = org.apache.flume.sink.kafka.KafkaSink
    log_agent.sinks.kafkaSink.topic=log-topic
    log_agent.sinks.kafkaSink.brokerList=kafka-host-1:9092,kafka-host-1:9092,kafka-host-1:9092
    log_agent.sinks.kafkaSink.requiredAcks=1
    log_agent.sinks.kafkaSink.batchSize=100
    
    # fileChannel definition
    log_agent.channels.fileChannel.type=file
    log_agent.channels.fileChannel.checkpointDir=/path/checkpoint/
    log_agent.channels.fileChannel.dataDirs=/path/data
    log_agent.channels.fileChannel.capacity=100000
    
  3. 我读过flume document,spooldir源默认使用Line Deserializer。 我下载了flume-1.6源代码,并在文件读取结束附近添加了打印行到ReliableSpoolingFileEventReader,它负责从日志中读取。 在达到EOF之前,读者似乎过早地结束了。

    任何建议都表示赞赏!

1 个答案:

答案 0 :(得分:0)

最后,我找到了原因。 LineDeserializer依赖于ResettableFileInputStream来读取文件。 ResettableFileInputStream 在读取多码点unicode字符时遇到问题。这个问题在flume1.7中得到了解决。

我用flume1.7替换了flume1.6 ResettableFileInputStream和source code,重新编译并替换了flume1.6 / lib中的flume-ng-core-1.6.0.jar。 然后spooldir源可以使用所有文件内容。

希望这可以帮助遇到同样问题的人。

请参阅apache issue site