Я ищу способ 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