ホームページ  >  記事  >  バックエンド開発  >  Python 開発 MapReduce シリーズ WordCount デモ

Python 開発 MapReduce シリーズ WordCount デモ

ringa_lee
ringa_leeオリジナル
2017-09-17 09:28:381737ブラウズ

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 &#39;\t&#39;.join([cur_word, str(sum)])
            cur_word = word
            sum = 0
        
        sum += int(count)    
    print &#39;\t&#39;.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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。