Распаковать файлы с помощью потоковой передачи Hadoop

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

Я старался:

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar \
    -D mapred.reduce.tasks=0 \
    -mapper /bin/zcat -reducer /bin/cat \
    -input /path/to/files/ \
    -output /path/to/output

Однако я получаю сообщение об ошибке (subprocess failed with code 1). Я также пытался запустить один файл с той же ошибкой.

Любой совет?


person lazy1    schedule 06.03.2013    source источник


Ответы (4)


Основная причина проблемы: вы получаете много (текстовой) информации от hadoop (прежде чем вы сможете получить данные).

например hdfs dfs -cat hdfs://hdm1.gphd.local:8020/hive/gphd/warehouse/my.db/my/part-m-00000.gz | зкат | wc -l также НЕ будет работать - с сообщением об ошибке «gzip: stdin: not in gzip format».

Поэтому вам следует пропустить эту «ненужную» информацию. В моем случае я должен пропустить 86 строк

Поэтому моя однострочная команда будет такой (для подсчета записей): hdfs dfs -cat hdfs://hdm1.gphd.local:8020/hive/gphd/warehouse/my.db/my/part-m-00000.gz |хвост -n+86 | зкат | туалет -л

Примечание: это обходной путь (не настоящее решение) и очень некрасивый - из-за "86" - но работает нормально :)

person Miklós Molnár    schedule 30.09.2014

Простой способ разархивировать / распаковать файл в HDFS по любой причине

hadoop fs -text /hdfs-path-to-zipped-file.gz | hadoop fs -put - /hdfs-path-to-unzipped-file.txt
person Jay    schedule 29.06.2014
comment
Это относится к одному файлу, заархивированному gzip (сжатому), а не к Zip-архиву, который может иметь несколько сжатых элементов. - person Ken Williams; 07.07.2015

Поэкспериментировав, я обнаружил, что если вы сделаете эту модификацию для потоковой передачи Hadoop, вы получите все ваши файлы, сжатые gzip, в несжатом виде в новом каталоге. Все имена файлов потеряны (переименованы в типичное имя part-XXXX), но это сработало для меня.

Я предполагаю, что это работает, потому что Hadoop автоматически распаковывает сжатые файлы под капотом, а cat просто повторяет этот разархивированный вывод.

hadoop jar /usr/iop/4.2.0.0/hadoop-mapreduce/hadoop-streaming.jar \
    -D mapred.reduce.tasks=0 \
    -mapper /bin/cat \
    -input  /path-to-gzip-files-directory \
    -output /your-gunzipped-directory
person dman    schedule 28.04.2017

Hadoop может читать файлы, сжатые в формате gzip, но это отличается от формата zip. Hadoop не может читать zip-файлы AFAIK.

person user394827    schedule 24.08.2013
comment
Это не имеет значения - задача картографа декодирует Zip-файл, Hadoop не нужно ничего знать о его формате. - person Ken Williams; 07.07.2015