MapReduce が elephant Hadoop のコアであることはわかっています。Hadoop では、データ処理のコアは MapReduce プログラミング モデルです。 Map/Reduce は通常、入力データ セットをいくつかの独立したデータ ブロックに分割し、マップ タスク (タスク) によって完全に並列的に処理されます。フレームワークはまずマップの出力を並べ替え、次に結果を reduce タスク に入力します。通常、ジョブの入力と出力はファイル システムに保存されます。したがって、私たちのプログラミングの中心は主にマッパーステージとリデューサーステージです。
MapReduce プログラムを最初から開発して、Hadoop クラスター上で実行してみましょう。
マッパーコードmap.py:
import sys for line in sys.stdin: word_list = line.strip().split(' ') for word in word_list: print '\t'.join([word.strip(), str(1)])
View Code
reducerコードreduce.py:
import sys cur_word = None sum = 0 for line in sys.stdin: ss = line.strip().split('\t') if len(ss) < 2: continue word = ss[0].strip() count = ss[1].strip() if cur_word == None: cur_word = word if cur_word != word: print '\t'.join([cur_word, str(sum)]) cur_word = word sum = 0 sum += int(count) print '\t'.join([cur_word, str(sum)]) sum = 0
View Code
リソースファイルsrc.txt (テスト用、クラスター内で実行)忘れずに HDFS にアップロードしてください):
hello ni hao ni haoni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ao ni haoni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni haoao ni haoni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao Dad would get out his mandolin and play for the family Dad loved to play the mandolin for his family he knew we enjoyed singing I had to mature into a man and have children of my own before I realized how much he had sacrificed I had to,mature into a man and,have children of my own before.I realized how much he had sacrificed
コードを表示
まずローカルでデバッグして結果が正しいかどうかを確認し、次のコマンドを入力します:
cat src.txt | python map.py | sort -k 1 | python reduce.py
コマンドラインに出力された結果:
a 2 and 2 and,have 1 ao 1 before 1 before.I 1 children 2 Dad 2 enjoyed 1 family 2 for 2 get 1 had 4 hao 33 haoao 1 haoni 3 have 1 he 3 hello 1 his 2 how 2 I 3 into 2 knew 1 loved 1 man 2 mandolin 2 mature 1 much 2 my 2 ni 34 of 2 out 1 own 2 play 2 realized 2 sacrificed 2 singing 1 the 2 to 2 to,mature 1 we 1 would 1
コードを表示
デバッグに合格しました。ローカル デバッグが見つかり、コードは OK です。それをクラスターに放り込んで実行します。便宜上、労働力を解放するための特別なスクリプト run.sh を作成しました。
HADOOP_CMD="/home/hadoop/hadoop/bin/hadoop" STREAM_JAR_PATH="/home/hadoop/hadoop/contrib/streaming/hadoop-streaming-1.2.1.jar" INPUT_FILE_PATH="/home/input/src.txt" OUTPUT_PATH="/home/output" $HADOOP_CMD fs -rmr $OUTPUT_PATH $HADOOP_CMD jar $STREAM_JAR_PATH \ -input $INPUT_FILE_PATH \ -output $OUTPUT_PATH \ -mapper "python map.py" \ -reducer "python reduce.py" \ -file ./map.py \ -file ./reduce.py
以下のスクリプトを分析してみましょう:
HADOOP_CMD: hadoop的bin的路径 STREAM_JAR_PATH:streaming jar包的路径 INPUT_FILE_PATH:hadoop集群上的资源输入路径 OUTPUT_PATH:hadoop集群上的结果输出路径。(注意:这个目录不应该存在的,因此在脚本加了先删除这个目录。**注意****注意****注意**:若是第一次执行,没有这个目录,会报错的。可以先手动新建一个新的output目录。) $HADOOP_CMD fs -rmr $OUTPUT_PATH $HADOOP_CMD jar $STREAM_JAR_PATH \ -input $INPUT_FILE_PATH \ -output $OUTPUT_PATH \ -mapper "python map.py" \ -reducer "python reduce.py" \ -file ./map.py \ -file ./reduce.py #这里固定格式,指定输入,输出的路径;指定mapper,reducer的文件; #并分发mapper,reducer角色的我们用户写的代码文件,因为集群其他的节点还没有mapper、reducer的可执行文件。
次のコマンドを入力して、削減フェーズ後のレコード出力を表示します:
cat src.txt | python map.py | sort -k 1 | python reduce.py | wc -l 命令行中输出:43
ブラウザに「master:50030」と入力して、タスクの詳細を表示します。
Kind % Complete Num Tasks Pending Running Complete Killed Failed/Killed Task Attempts map 100.00% 2 0 0 2 0 0 / 0 reduce 100.00% 1 0 0 1 0 0 / 0
これは Map-Reduce フレームワークで見られました。
Counter Map Reduce Total Reduce output records 0 0 43
プロセス全体が成功したことの証明。最初の Hadoop プログラムの開発が完了しました。
以上がPython 開発 MapReduce シリーズ WordCount デモの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。