1. 程式人生 > >Python Hadoop的Wordcount入門示例

Python Hadoop的Wordcount入門示例

        Hadoop 框架是使用Java編寫的但是我們仍然需要使用像C++、Python等語言來實現 Hadoop程式。儘管Hadoop官方網站給的示例程式是使用Jython編寫並打包成Jar檔案,這樣顯然造成了不便,其實,不一定非要這樣來實現,我們可以使用Python與Hadoop 關聯進行程式設計,看看位於/src/examples/python/WordCount.py  的例子。

我們將編寫一個簡單的 MapReduce 程式,使用的是C-Python,而不是Jython編寫後打包成jar包的程式。

我們的這個例子將模仿 WordCount 並使用Python來實現,例子通過讀取文字檔案來統計出單詞的出現次數。結果也以文字形式輸出,每一行包含一個單詞和單詞出現的次數。

  首先,編寫這個程式之前,你學要架設好Hadoop 叢集

1、可以使用Pythoncharm開發也可以直接python【跑叢集時要提交伺服器執行】

    使用Python編寫MapReduce程式碼的技巧就在於我們使用了 HadoopStreaming 來幫助我們在Map 和 Reduce間傳遞資料通過STDIN (標準輸入)和STDOUT (標準輸出).我們僅僅使用Python的sys.stdin來輸入資料,使用sys.stdout輸出資料,這樣做是因為HadoopStreaming會幫我們辦好其他事。

2、執行原理
       使用python寫MapReduce的“訣竅”是利用Hadoop流的API,通過STDIN(標準輸入)、STDOUT(標準輸出)在Map函式和Reduce函式之間傳遞資料。我們唯一需要做的是利用Python的sys.stdin讀取輸入資料,並把我們的輸出傳送給sys.stdout。Hadoop流將會幫助我們處理別的任何事情。

3、Map階段

複製程式碼
[root@mycentos ~]$ vim mapper.py

#!/usr/bin/env python
import sys

for line in sys.stdin:
    line = line.strip()
    words = line.split()
    for word in words:
        print ("%s\t%s") % (word, 1)

程式說明:檔案從STDIN讀取檔案。把單詞切開,並把單詞和詞頻輸出STDOUT。Map指令碼不會計算單詞的總數,而是輸出<word> 1。在我們的例子中,我們讓隨後的Reduce階段做統計工作。

設定執行許可權

chmod +x mapper.py

3、Reduce階段

複製程式碼
[root@mycentos ~]$ vim reduce.py

#!/usr/bin/env python
from operator import itemgetter
import sys

current_word = None
current_count = 0
word = None

for line in sys.stdin:
    line = line.strip()
    word, count = line.split('\t', 1)
    try:
        count = int(count)
    except ValueError:  #count如果不是數字的話,直接忽略掉
        continue
    if current_word == word:
        current_count += count
    else:
        if current_word:
            print ("%s\t%s") % (current_word, current_count)
        current_count = count
        current_word = word

if word == current_word:  #不要忘記最後的輸出
    print ("%s\t%s") % (current_word, current_count)
複製程式碼

程式說明:檔案會讀取mapper.py 的結果作為reducer.py 的輸入,並統計每個單詞出現的總的次數,把最終的結果輸出到STDOUT。

注意:split(chara, m),第二個引數的作用表示只擷取一次。

增加執行許可權

chmod +x reducer.py

4、如何測試

[root@mycentos ~]$echo "pib foo foo quux labs foo bar quux" | ./mapper.py | sort -k1,1 | ./reducer.py    #-k1 表示按key倒序輸出

5、如何在Hadoop上執行

首先寫一個指令碼run.sh(因為程式碼較長,直接寫不太方便)

複製程式碼
[root@mycentos ~]$ vim run.sh

hadoop jar /home/hadoopuser/hadoop-2.6.0-cdh5.6.0/share/hadoop/tools/lib/hadoop-*streaming*.jar \
-file /home/hadoopuser/mydoc/py/mapper.py       -mapper /home/hadoopuser/mydoc/py/mapper.py \
-file /home/hadoopuser/mydoc/py/reduce.py       -reducer /home/hadoopuser/mydoc/py/reduce.py \
-input /tmp/py/input/*  -output /tmp/py/output
複製程式碼

增加執行許可權

chmod +x run.sh

6、執行結果

複製程式碼
would    2101
wounded    21
wrapped    9
wrong.    17
wronged    10
year    80
yelled    5