Есть ли способ скопировать сжатый контент в формате hdf без его распаковки?
Я ищу способ zgrep
hdfs
файлы
что-то вроде:
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