在Hadoop平台跑python腳本


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM