2015-05-06 2 views
4

Как объединить все файлы в каталоге HDFS, которые, как мне известно, сжаты, в один сжатый файл, без копирование данных через локальную машину? Например, но не обязательно, используя Pig?Слияние сжатых файлов на HDFS

В качестве примера у меня есть папка/данные/ввод, содержащий файлы part-m-00000.gz и part-m-00001.gz. Теперь я хочу объединить их в один файл /data/output/foo.gz

ответ

0

Я знаю, что есть возможность выполнить слияние с локальной файловой системой с помощью команды «hdfs dfs -getMerge». Возможно, вы можете использовать это для объединения в локальную файловую систему, а затем использовать команду «hdfs dfs -copyFromLocal», чтобы скопировать ее обратно в hdfs.

+0

Но я хочу избежать передачи данных назад и вперед в локальную файловую систему. – matthiash

1

Если вы установите Параллель 1, то у вас будет один выходной файл. можно сделать 2-мя способами:

  1. в вашей свиньи добавить set default_parallel 20;, но обратите внимание, что этот эффект все в вашей свиньи
  2. Изменение Параллельная для одной операции - как DISTINCT ID PARALLEL 1;

Подробнее о Parallel Features

4

Я бы предложил посмотреть FileCrush (https://github.com/edwardcapriolo/filecrush), инструмент для объединения файлов на HDFS с использованием MapReduce. Он выполняет именно то, что вы описали, и предоставляет несколько вариантов обработки сжатий и управления количеством выходных файлов.

Crush --max-file-blocks XXX /data/input /data/output 

max-file-blocks представляет собой максимальное количество блоков в ДФС выходного файла. Например, в соответствии с документацией:

со значением по умолчанию 8, 80 маленьких файлов, каждый из которых 1/10th ДФС блок будет сгруппированных в к одному выходному файлу, так как 8 * 1/10 = 8 dfs блоки. Если имеется 81 маленький файл, каждый из которых будет 1/10th блока dfs , будут созданы два выходных файла. Один выходной файл содержит комбинированное содержимое из 41 файла, а второе будет содержать объединенное содержимое других 40. Каталог многих небольших файлов будет , преобразованный в меньшее количество больших файлов, где каждый выходной файл примерно одинаковый размер.

Смежные вопросы