2011-11-10 10 views
1

私は弾力的なmapreduceを学び、Amazonチュートリアルセクション(以下に示すコード)で提供されているWord Splitterの例題から始めました。この例では、提供されたすべての入力文書のすべての単語の語数が生成されます。EC2でmapreduceジョブを実行しているときにファイル名を取得する方法は?

しかし、私はワードカウントの出力をファイル名、すなわち1つの特定のドキュメント内の単語の数で取得したいと考えています。単語カウント用のPythonコードは標準入力からの入力を受け取るので、どの入力行がどのドキュメントから来たのかをどのようにして知ることができますか?

ありがとうございました。典型的な例ではWORDCOUNT

#!/usr/bin/python 

import sys 
import re 

def main(argv): 
    line = sys.stdin.readline() 
    pattern = re.compile("[a-zA-Z][a-zA-Z0-9]*") 
    try: 
    while line: 
     for word in pattern.findall(line): 
     print "LongValueSum:" + word.lower() + "\t" + "1" 
     line = sys.stdin.readline() 
    except "end of file": 
    return None 
if __name__ == "__main__": 
    main(sys.argv) 

答えて

5

ジョブ出力をファイルレベルですべての入力ファイルとないの連結ワードカウントが含まれているので、マップファイルが処理しているファイル名は、無視されます。しかし、単語レベルをファイルレベルで取得するには、入力ファイル名を使用する必要があります。 Pythonを使用するマッパーはos.environ["map.input.file"]コマンドを使用してファイル名を取得できます。タスク実行環境変数のリストはhereです。

キー/値のペアを<Hello, 1>として発行する代わりに、マッパーは処理中の入力ファイル名も含める必要があります。以下は、マップ<input.txt, <Hello, 1>>によって出されます。ここで、input.txtはキーで、<Hello, 1>は値です。

ここで、特定のファイルのすべての語数は、1つの減速機で処理されます。レデューサーは、特定のファイルの語数を集計する必要があります。

いつものように、コンバイナは、マッパとレデューサの間のネットワークのチャタリングを減らし、またジョブをより速く完了するのに役立ちます。

テキスト処理に関するその他のアルゴリズムについては、Data-Intensive Text Processing with MapReduceを参照してください。

+0

ありがとうございました!私はあなたのブログを見て、あなたは初心者のために "Hadoop the Defn guide"という本をお勧めします。しかし、あなたが言及したように、私はMapReduceの方法で考える必要があります。それのための良い情報源はありますか?また、Hadoopの開発について学ぶのに十分な本ですか? – Nik

+1

MR(http://goo.gl/kECuV)で解決されたさまざまな問題を確認します。 GoogleのMR動画(http://goo.gl/RRoVP)をご覧ください。 「Hadoop:The Definitive Guide」という本は、Hadoopの聖書のようなものです。 「Apress:Pro Hadoop」(http://goo.gl/VTcfa)もありますが、私はそのスタイルが気に入らないのです。 –

+0

FYI、新しいバージョンのHadoopでは、変数はmap_input_fileです。 (2.0.2の場合) – Paul

関連する問題