Назад | Перейти на главную страницу

Есть ли способ grep gzip-содержимого в hdfs без его извлечения?

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

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

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

или

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

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

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

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

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

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

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

zless / zcat / zgrep просто обертки, которые делают gzip вывести распакованные данные на стандартный вывод. Чтобы делать то, что вы хотите, вам просто нужно написать оболочку вокруг Hadoop FS команды.

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

Вы написали:

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

Это пытается связаться с хостом или кластером, который называется myfile.gz. То, что вы действительно хотите, это либо hdfs: ///myfile.gz или (при условии, что ваши файлы конфигурации настроены правильно) просто myfile.gz, к которому команда hadoop должна добавить правильный путь кластера / узла имени, определенный 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

Я обычно использую крепления hdfs fuse ... поэтому могу использовать практически любые обычные команды 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