2016-10-05 9 views
0

У меня есть 24-гигабайтная папка в локальной файловой системе. Моя задача - переместить эту папку в HDFS. Два пути я сделал это. 1) hdfs dfs -copyFromLocal/home/data// home/Apache Flume занимает больше времени, чем copyFromLocal command

Для этого потребовалось около 15 минут.

2) Использование флюма.

Вот мой агент

spool_dir.sources = src-1 
spool_dir.channels = channel-1 
spool_dir.sinks = sink_to_hdfs 
# source 
spool_dir.sources.src-1.type = spooldir 
spool_dir.sources.src-1.channels = channel-1 
spool_dir.sources.src-1.spoolDir = /home/data/ 
spool_dir.sources.src-1.fileHeader = false 
# HDFS sinks 
spool_dir.sinks.sink_to_hdfs.type = hdfs 
spool_dir.sinks.sink_to_hdfs.hdfs.fileType = DataStream 
spool_dir.sinks.sink_to_hdfs.hdfs.path = hdfs://192.168.1.71/home/user/flumepush 
spool_dir.sinks.sink_to_hdfs.hdfs.filePrefix = customevent 
spool_dir.sinks.sink_to_hdfs.hdfs.fileSuffix = .log 
spool_dir.sinks.sink_to_hdfs.hdfs.batchSize = 1000 
spool_dir.channels.channel-1.type = file 
spool_dir.channels.channel-1.checkpointDir = /home/user/spool_dir_checkpoint 
spool_dir.channels.channel-1.dataDirs = /home/user/spool_dir_data 
spool_dir.sources.src-1.channels = channel-1 
spool_dir.sinks.sink_to_hdfs.channel = channel-1 

Этот шаг занял почти час, чтобы передавать данные HDFS.

Согласно моим знаниям, Flume распространяется, поэтому не должно быть, чтобы Flume загружал данные быстрее, чем copyFromLocal.

+0

есть ли у вас какая-либо дополнительная информации о данных, которые вы хотели бы поместить в HDFS? ли данные журнала? изменит ли это со временем? Где эти данные генерируются? – bessbd

ответ

0

Apache Flume не предназначен для перемещения или копирования папок из локальной файловой системы в HDFS. Flume предназначен для эффективного сбора, агрегации и перемещения большого количества данных журнала из разных источников в централизованное хранилище данных. (Ссылка: Flume User Guide)

Если вы хотите переместить большие файлы или каталоги, вы должны использовать hdfs dfs -copyFromLocal, как вы уже упоминали.

+0

Я не согласен с вашей вступительной речью, это является использование флема - для автоматической копирования данных в HDFS с локального диска. –

+0

Согласно https://flume.apache.org/FlumeUserGuide.html, «Apache Flume - это распределенная, надежная и доступная система для эффективного сбора, агрегирование и перемещение больших объемов данных журнала из разных источников s в централизованное хранилище данных ». Если эти данные генерируют файлы журналов, вы можете использовать источник taildir, который является новой функцией в Flume. Думаю, это был бы случай использования, о котором вы упомянули. – bessbd

1

Если вы просто ищете при работе с записью и записью, то с вашей конфигурацией поток будет как минимум в 2 раза медленнее с вашей конфигурацией при использовании файлового канала - каждый файл, считанный с диска, инкапсулируется в событие flume (в памяти), а затем сериализоваться обратно на диск через канал файла. Затем приемник считывает событие обратно из файлового канала (диска), прежде чем нажимать его на hdf.

Вы также не установили десериализатор blob на источник spoolDir (так что он считывает по одной строке за раз из исходных файлов, обертывает событие Flume и затем записывает в канал файла), поэтому в паре с HDFS По умолчанию значения по умолчанию rollXXX вы получите файл в hdfs на 10 событий/30 с/1k, а не файл на входной файл, который вы получите с помощью copyFromLocal.

Все эти факторы создают дополнительную производительность. Если вы хотите получить более сопоставимую производительность, вы должны использовать BlobDeserializer в источнике spoolDir в сочетании с каналом памяти (но поймите, что канал памяти не гарантирует доставку события в случае преждевременного прекращения JRE.