2013-03-06 3 views
3

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

Я пробовал:

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) Я также попытался запустить на одном файле, такая же ошибка.

Любые советы?

ответ

-2

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

+0

Это не имеет значения - задача картографа декодирует файл Zip, Hadoop не нужно знать ничего о его формате. –

0

Простой способ для распаковки/распаковать файл в HDFS по какой-либо причине

hadoop fs -text /hdfs-path-to-zipped-file.gz | hadoop fs -put - /hdfs-path-to-unzipped-file.txt 
+0

Это для gzipped (сжатого) одного файла, а не для архива Zip, который может иметь несколько сжатых элементов. –

1

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

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

Поэтому вы должны пропустить эту информацию "лишних". В моем случае я должен пропустить 86 линий

Поэтому моя одна командная строка будет это (для подсчета записей): HDFS Dfs -cat HDFS: //hdm1.gphd.local: 8020/улей/gphd/склад /my.db/my/part-m-00000.gz | tail -n + 86 | zcat | туалет -l

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

+0

Спасибо за информацию. – lazy1

0

После экспериментов вокруг, я обнаружил, что если вы сделаете это модификация потоковой передачи hadoop, вы получите все ваши файлы gzipped, несжатые в новом каталоге. Имена файлов все потеряны (переименовано в типичное имя части XXXX), но это сработало для меня.

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

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 
Смежные вопросы