Есть ли способ скопировать сжатый контент в формате hdf без его распаковки?

Я ищу способ zgrephdfs файлы

что-то вроде:

hadoop fs -zcat hdfs://myfile.gz | grep "hi"

или же

hadoop fs -cat hdfs://myfile.gz | zgrep "hi"

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

3 ответа

Решение

zless/zcat/zgrep - это просто оболочки, которые заставляют gzip выводить распакованные данные на стандартный вывод. Чтобы сделать то, что вы хотите, вам просто нужно написать оболочку для команд hadoop fs.

В сторону: причина, по которой это, вероятно, не сработало для вас, заключается в том, что вам не хватает дополнительной косой черты в вашем hdfs URI.

Вы написали:

hadoop fs -cat hdfs://myfile.gz | zgrep "hi"

Это пытается связаться с хостом или кластером с именем myfile.gz. Что вам действительно нужно, так это либо hdfs:///myfile.gz, либо (при условии, что ваши файлы конфигурации настроены правильно), просто myfile.gz, которому команда hadoop должна предшествовать правильный путь кластера /namenode, определенный fs.defaultFS.

Следующее работает для меня.

$ hadoop fs -ls hdfs:///user/hcoyote/foo.gz
Found 1 items
-rw-r--r--   3 hcoyote users    5184637 2015-02-20 12:17 hdfs:///user/hcoyote/foo.gz

$ hadoop fs -cat hdfs:///user/hcoyote/foo.gz | gzip -c -d | grep -c Authorization
425893

$ hadoop fs -cat hdfs:///user/hcoyote/foo.gz | zgrep -c Authorization
425893

Эта командная строка автоматически найдет подходящий декомпрессор для любого простого текстового файла и выведет несжатые данные в стандартный вывод:

hadoop fs -text hdfs:///path/to/file [hdfs:///path/to/another/file]

Я использовал это для файлов.snappy & .gz. Вероятно, это работает для файлов.lzo и.bz2.

Это важная функция, потому что Hadoop использует собственный формат файлов для файлов Snappy. Это единственный прямой способ распаковать созданный Hadoop файл Snappy. В командной строке нет команды unsnappy, как и для других компрессоров. Я также не знаю ни одной прямой команды, которая ее создает. Я создал их только как данные таблицы Hive.

Замечания: hadoop fs -text является однопоточным и выполняет распаковку на компьютере, на котором вы запускаете команду.

Я обычно использую hdfs fuse mounts.., поэтому могу использовать практически любые обычные команды Unix (некоторые команды могут не работать, так как hdfs не является POSIX-совместимой файловой системой).

Gunzip/zcat

$ gunzip /hdfs_mount/dir1/somefile.gz 
$ grep hi /hdfs_mount/dir1/somefile.gz 

прекрасно работает на держателях предохранителей hdfs. И быстрее печатать тоже:), легче читать, например, если вы хотите написать это.

Чтобы смонтировать hadoop в качестве "обычной" файловой системы: http://www.cloudera.com/content/cloudera/en/documentation/cdh4/latest/CDH4-Installation-Guide/cdh4ig_topic_28.html

Другие вопросы по тегам