Flume создает пустую строку в конце выходного файла в HDFS

В настоящее время я использую версию Flume: 1.5.2.

Flume создает пустую строку в конце каждого выходного файла в HDFS, что приводит к тому, что количество строк, размеры файлов и контрольная сумма не совпадают для исходного и целевого файлов.

Я попытался переопределить значения параметров roolSize, batchSize и appendNewline по умолчанию, но все равно не работает.

Также поток меняет EOL с CRLF (исходный файл) на LF (выходной файл), что также приводит к различию размера файла.

Ниже приведены соответствующие параметры конфигурации агента Flume, которые я использую.

 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 не устранил проблему.
Может ли кто-нибудь проверить и предложить..


person kasi    schedule 13.01.2016    source источник


Ответы (2)


Замените строку ниже в вашем Flume Agent.

agent1.sinks.c1s1.serializer.appendNewline = false

со следующей строкой и дайте мне знать, как это происходит.

agent1.sinks.c1s1.hdfs.serializer.appendNewline = false
person RAJESH    schedule 13.01.2016
comment
Спасибо Раджеш за изучение этого. Я все еще получаю разницу в размере файла, как показано ниже - person kasi; 14.01.2016
comment
Я все еще получаю разницу в размере файла. 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 14 января 00:42 TermDefinition. csv.1452750041843.csv -rwxrw-rw- 1 biadmin biadmin 767 14 января 00:06 TermDefinition.csv.COMPLETED biadmin@bivm:~/Desktop/work/flume-test/sourcedata1› - person kasi; 14.01.2016
comment
Мои наблюдения заключаются в том, что EOL меняется с CRLF на LF из-за этого размера файла. Я не могу поделиться своим файлом конфигурации, так как в этом разделе комментариев есть ограничение на количество символов, которые нужно заполнить. Не могли бы вы подсказать, как решить эту проблему. - person kasi; 14.01.2016

Заменять

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, а непосредственно для имени приемника.

В документации Flume должен быть какой-то пример, поскольку я также столкнулся с проблемами, потому что не заметил, что сериализатор установлен на другом уровне имени свойства.

Дополнительную информацию о приемнике Hdfs можно найти здесь: https://flume.apache.org/FlumeUserGuide.html#hdfs-sink

person Łukasz Gawron    schedule 24.07.2017