1

Hadoop Streaming を使用して などの 2 つのコマンドを実行しようとしていますgunzip | map_to_old_format.pyが、gzip で "|.gz not found" というエラーが発生するか、これらの行に沿って何かが発生します (Hadoop を介して実行した場合のみ.. コマンド ラインで実行すると動作します)。大丈夫)。

Python でその場で gunzip する方法がわからないので、このコマンドを組み合わせて実行するシェル スクリプトを 1 つ作成したいと思います (例: gunzip_and_map_to_old.sh)。私はこれを次のように試しましたが、gzip は気に入りませんでした (gzip は「gzip: stdin: not in gzip format」と文句を言います):

#!/bin/bash
while read data; do
    echo $data | gunzip | map_to_old_format.py $2
done

python gunzip に関しては、ここでf = gzip.GzipFile("", "rb", fileobj=sys.stdin)説明されている Wrapper メソッドと同様に試しました。

4

3 に答える 3

2

私は Hadoop について何も知りませんが、 は の行であり、それ自体はおそらく gzip 形式でecho $data | gunzipはないため、機能しないと推測します。データを 1 行ずつ渡す代わりに、bash スクリプト ファイルでこれを行うことはできませんか?$datadata$data

#!/bin/bash
gunzip | map_to_old_format.py

次に、次のように gzip ファイルを渡すことで呼び出すことができます。

cat data.gz | gunzip_and_map_to_old.sh
于 2012-05-12T22:06:36.270 に答える
1

これは私の正確な質問には答えませんが-jobconf stream.recordreader.compression=gzip、Hadoop コマンドに追加することでバイパスできました (これを学んだソース):

hadoop jar /usr/lib/hadoop/contrib/streaming/hadoop-streaming-*.jar \
    -jobconf stream.recordreader.compression=gzip \
    -D mapred.reduce.tasks=0 \
    -file map_to_old_format.py \
    -mapper map_to_old_format.py \
    -input /mydata/* -output output/newdata

注:シェル スクリプトを使用して上記を実現する方法にまだ興味があるので、可能であればお知らせください。

于 2012-05-12T20:18:24.087 に答える
1

Hadoop ストリーミングは通常、TextInputFormat を使用して入力ファイルを読み取り、std in を介して 1 行ずつ Python マッパーに渡します (キーと値を区切るタブ文字を使用します (ほとんどの場合、行番号と行テキスト)。

入力ファイルのファイル拡張子が .gz で終わらない場合、hadoops TextInputFormat は、行を 1 行ずつ渡す前に、ファイルの内容を gunzip と認識しません。他の回答で示唆されているように、プロパティを構成して、hadoop にファイルを gunzip させることができます。

于 2012-05-12T22:30:33.983 に答える