【问题标题】:Flume creating an empty line at the end of output file in HDFSFlume 在 HDFS 的输出文件末尾创建一个空行
【发布时间】:2016-01-13 15:48:10
【问题描述】:

目前我使用的是 Flume 版本:1.5.2。

Flume 在 HDFS 中每个输出文件的末尾创建一个空行,导致源文件和目标文件的行数、文件大小和校验和不匹配。

我尝试覆盖参数 roolSize、batchSize 和 appendNewline 的默认值,但仍然无法正常工作。

另外,将 EOL 从 CRLF(源文件)更改为 LF(输出文件)也会导致文件大小不同

以下是我正在使用的相关水槽代理配置参数

 agent1.sources = c1
 agent1.sinks = c1s1
 agent1.channels = ch1

 agent1.sources.c1.type = spooldir
 agent1.sources.c1.spoolDir = /home/biadmin/flume-test/sourcedata1
 agent1.sources.c1.bufferMaxLineLength = 80000
 agent1.sources.c1.channels = ch1
 agent1.sources.c1.fileHeader = true 
 agent1.sources.c1.fileHeaderKey = file
 #agent1.sources.c1.basenameHeader = true
 #agent1.sources.c1.fileHeaderKey = basenameHeaderKey
 #agent1.sources.c1.filePrefix = %{basename}
 agent1.sources.c1.inputCharset = UTF-8
 agent1.sources.c1.decodeErrorPolicy = IGNORE
 agent1.sources.c1.deserializer= LINE
 agent1.sources.c1.deserializer.maxLineLength =  50000
 agent1.sources.c1.deserializer=
 org.apache.flume.sink.solr.morphline.BlobDeserializer$Builder
agent1.sources.c1.interceptors = a b
agent1.sources.c1.interceptors.a.type  =     
org.apache.flume.interceptor.TimestampInterceptor$Builder
agent1.sources.c1.interceptors.b.type =
org.apache.flume.interceptor.HostInterceptor$Builder
agent1.sources.c1.interceptors.b.preserveExisting = false
agent1.sources.c1.interceptors.b.hostHeader = host

agent1.channels.ch1.type = memory
agent1.channels.ch1.capacity = 1000
agent1.channels.ch1.transactionCapacity = 1000
agent1.channels.ch1.batchSize = 1000
agent1.channels.ch1.maxFileSize = 2073741824
agent1.channels.ch1.keep-alive = 5
agent1.sinks.c1s1.type = hdfs
agent1.sinks.c1s1.hdfs.path = hdfs://bivm.ibm.com:9000/user/biadmin/
flume/%y-%m-%d/%H%M
agent1.sinks.c1s1.hdfs.fileType = DataStream
agent1.sinks.c1s1.hdfs.filePrefix = %{file}
agent1.sinks.c1s1.hdfs.fileSuffix =.csv
agent1.sinks.c1s1.hdfs.writeFormat = Text
agent1.sinks.c1s1.hdfs.maxOpenFiles = 10
agent1.sinks.c1s1.hdfs.rollSize = 67000000
agent1.sinks.c1s1.hdfs.rollCount = 0
#agent1.sinks.c1s1.hdfs.rollInterval = 0
agent1.sinks.c1s1.hdfs.batchSize = 1000
agent1.sinks.c1s1.channel = ch1
#agent1.sinks.c1s1.hdfs.codeC = snappyCodec
agent1.sinks.c1s1.hdfs.serializer = text
agent1.sinks.c1s1.hdfs.serializer.appendNewline = false

hdfs.serializer.appendNewline 没有解决这个问题。
任何人都可以检查并建议..

【问题讨论】:

    标签: hadoop flume flume-ng bigdata


    【解决方案1】:

    在您的水槽代理中替换以下行。

    agent1.sinks.c1s1.serializer.appendNewline = false
    

    下面一行,让我知道它是怎么回事。

    agent1.sinks.c1s1.hdfs.serializer.appendNewline = false
    

    【讨论】:

    • 感谢 Rajesh 对此进行调查。我仍然得到如下所示的文件大小差异
    • 文件大小仍然存在差异。 biadmin@bivm:~/Desktop/work/flume-test/sourcedata1> hadoop fs -copyToLocal hdfs://bivm.ibm.com:9000/user/biadmin/flume/home/biadmin/Desktop/work/flume-test/ sourcedata1/TermDefinition.csv.1452750041843.csv biadmin@bivm:~/Desktop/work/flume-test/sourcedata1> ls -l total 8 -rw-r--r-- 1 biadmin biadmin 754 Jan 14 00:42 TermDefinition。 csv.1452750041843.csv -rwxrw-rw- 1 biadmin biadmin 767 Jan 14 00:06 TermDefinition.csv.COMPLETED biadmin@bivm:~/Desktop/work/flume-test/sourcedata1>
    • 我的观察是 EOL 正在从 CRLF 更改为 LF,因为此文件大小有所不同。我无法分享我的 conf 文件,因为此评论部分对要填写的字符数有限制。您能否建议如何解决此问题。
    【解决方案2】:

    替换

    agent1.sinks.c1s1.hdfs.serializer = text
    agent1.sinks.c1s1.hdfs.serializer.appendNewline = false
    

    agent1.sinks.c1s1.serializer = text
    agent1.sinks.c1s1.serializer.appendNewline = false
    

    不同之处在于,序列化器设置不是在 hdfs 前缀上设置的,而是直接在 sink 名称上设置的。

    Flume 文档应该有一些示例,因为我也遇到了问题,因为我没有发现序列化程序设置在不同级别的属性名称上。

    更多关于 Hdfs sink 的信息可以在这里找到: https://flume.apache.org/FlumeUserGuide.html#hdfs-sink

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2017-12-02
      • 2021-11-13
      • 2019-11-05
      相关资源
      最近更新 更多