Какой самый простой способ объединить небольшие блоки HDFS? - PullRequest
6 голосов
/ 13 декабря 2010

Я собираю журналы с Flume для HDFS.Для тестового примера у меня есть небольшие файлы (~ 300 КБ), потому что процесс сбора журналов был масштабирован для реального использования.

Есть ли простой способ объединить эти небольшие файлы в более крупные, которые ближе к блоку HDFSразмер (64МБ)?

Ответы [ 3 ]

5 голосов
/ 13 декабря 2010

GNU coreutils split может выполнить эту работу.

Если исходные данные являются строками - в моем случае они есть - и одна строка составляет около 84 bytes, тогда блок HDFS64MB может содержать около 800000 строк:

hadoop dfs -cat /sourcedir/* | split --lines=800000 - joined_
hadoop dfs -copyFromLocal ./joined_* /destdir/

или с опцией --line-bytes:

hadoop dfs -cat /sourcedir/* | split --line-bytes=67108864 - joined_
hadoop dfs -copyFromLocal ./joined_* /destdir/
3 голосов
/ 22 апреля 2012

Вы должны взглянуть на File Crusher с открытым исходным кодом media6degrees.Это может быть немного устаревшим, но вы можете скачать исходный код и внести свои изменения и / или внести свой вклад.JAR и Source находятся в: http://www.jointhegrid.com/hadoop_filecrush/index.jsp

Это, по сути, метод сокращения карты для объединения небольших файлов.

3 голосов
/ 13 декабря 2010

Мое текущее решение - написать работу MapReduce, которая фактически ничего не делает, имея ограниченное количество редукторов.Каждый редуктор выводит файл, так что это объединяет их.Вы можете добавить имя исходного файла в каждой строке, чтобы показать, откуда он пришел.

Мне все еще интересно узнать, существует ли стандартный или проверенный лучший способ сделать это, которого я не знаюиз.

...