2010-07-02 4 views
0

Я хочу объединить 2 файла bzip2'ed. Я попытался добавить один к другому: cat file1.bzip2 file2.bzip2 > out.bzip2, который, кажется, работает (этот файл распакован правильно), но я хочу использовать этот файл в качестве входного файла Hadoop, и я получаю ошибки о поврежденных блоках.Как слить 2 файла bzip2'ed?

Каков наилучший способ объединить 2 файла bzip2'ed без их распаковки?

ответ

2

Обращение с конкатенированным bzip фиксировано на багажнике, или должно быть: https://issues.apache.org/jira/browse/HADOOP-4012. Есть примеры его работы: https://issues.apache.org/jira/browse/MAPREDUCE-477?focusedCommentId=12871993&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#action_12871993 Убедитесь, что вы используете последнюю версию Hadoop, и все должно быть в порядке.

+0

Файлы с Bzipped разделены правильно, но я все еще не могу понять, как выполнять задачу карты в конкатенированных файлах. (Но после распаковки всех из них, тогда 'cat', а затем сжимает этот большой файл ввода работает) – wlk

1

Вы можете сжать (ну, сохраните) их оба в новый bz2? Это означало бы, что вам нужно будет сделать 3 раза, чтобы получить содержимое двух архивов, но может работать с вашим сценарием.

+0

Это очень хорошая идея, гораздо лучше, если бы bzip2 был бы умным, и понадобилось бы только 1 декомпрессии. – wlk

0

Вы бы не нужно иметь, чтобы объединить файлы, чтобы использовать их в качестве Hadoop ввода:

  • считают file_name* - образец;
  • file_name_1,file_name_2 - список входов.

И Hadoop справится с этим.

В противном случае вы можете использовать потоковое воспроизведение Hadoop для их объединения (с декомпрессией).

Вы можете произвести список файлов по шаблону, как:

FILES_LIST="'ls -m template*.bz2'"

INPUT_FILE="'echo $FILES_LIST | tr -d ' ' '"

' внутренние кавычки должны быть разными. Вы можете передать $INPUT_FILE в качестве переменной в свой скрипт через CLI.

Также рассмотрите класс CombineFileInputFormat как InputFormat.

+1

Я пробовал это, но проблема возникает, когда у вас есть несколько тысяч сжатых файлов по 1 МБ каждый, и вы не хотите загружать их к HDFS, но иметь один большой файл, который вы можете загрузить. – wlk

+0

'lbzcat part * | lbzcat -z> output_file' –

+0

Мой последний комментарий делает слияние файлов, но hasoop не может их прочитать полностью после этого. –