1、開發IDE,我使用的是PyCharm。
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