web-dev-qa-db-ja.com

抽出せずにhdfsでgzip圧縮されたコンテンツをgrepする方法はありますか?

zgrephdfsファイルへの方法を探しています

何かのようなもの:

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

または

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

コマンドラインでそれを実現する方法はありますか?

4
Jas

zless/zcat/zgrepは単にシェルラッパーで、gzipは解凍されたデータをstdoutに出力します。やりたいことを行うには、hadoop fsコマンドの周りにラッパーを書くだけです。

余談:これがおそらくうまくいかなかった理由は、hdfs URIに追加のスラッシュがないためです。

あなたが書いた:

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

これはmyfile.gzというホストまたはクラスターへの接続を試みます。実際に必要なのはhdfs:///myfile.gzまたは(設定ファイルが正しく設定されている場合)、単にmyfile.gzで、hadoopコマンドはfs.defaultFSで定義された正しいcluster/namenodeパスを先頭に追加します。

次は私のために働きます。

$ 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
4
Travis Campbell

このコマンドラインは、単純なテキストファイルに適した解凍プログラムを自動的に見つけ、非圧縮データを標準出力に出力します。

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はシングルスレッドであり、コマンドを実行するマシンで解凍を実行します。

6
jackparsons

私は通常hdfs Fuseマウントを使用します。そのため、ほとんどすべての通常のUnixコマンドを使用できます(hdfsはPOSIX準拠のファイルシステムではないため、一部のコマンドは機能しない可能性があります)。

gunzip/zcat

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

hdfs Fuseマウントで問題なく動作します。そして、タイプも速く:)、例えば、あなたはそれをスクリプト化したいです。

Hadoopを「通常の」ファイルシステムとしてマウントするには: http://www.cloudera.com/content/cloudera/en/documentation/cdh4/latest/CDH4-Installation-Guide/cdh4ig_topic_28.html

0
Tagar