Mrjob簡介
Mrjob是一個編寫MapReduce任務的開源Python框架,它實際上對Hadoop Streaming的命令行進行了封裝,因此接粗不到Hadoop的數據流命令行,使我們可以更輕松、快速的編寫MapReduce任務。
Mrjob具有如下特點:
代碼簡潔,map及reduce函數通過一個Python文件就可以搞定;
支持多步驟的MapReduce任務工作流;
支持多種運行方式,包括內嵌方式、本地環境、Hadoop、遠程亞馬遜;
支持亞馬遜網絡數據分析服務Elastic MapReduce(EMR);
調試方便,無需任何支持環境。
Mrjob編寫MapReduce
安裝Mrjob
easy_install mrjob
功能:實現一個統計文本文件(/root/hadooptest/input.txt)中所有單詞出現頻率的功能。Mrjob通過mapper()和reducer()方法實現MR操作。
【/root/hadooptest/input.txt】
foo foo quux labs foo bar quux abc bar see you by test welcome test
abc labs foo me python hadoop ab ac bc bec python
MapReduce腳本
Mrjob通過Python的yield機制將函數變成一個生成器,通過不斷調用next()去實現key:value的初始化或運算操作。
【/root/hadooptest/word_count.py】
#!/usr/bin/env python # -*- coding:utf-8 -*- from mrjob.job import MRJob class MRWordCounter(MRJob): def mapper(self,key,line): #接收每一行的輸入數據,處理后返回一堆key:value,初始化value值為1 for word in line.split(): yield word,1 def reducer(self,word,occurrences): #接收mapper輸出的key:value對進行整合,把相同key的value做累加(sum)操作后輸出 yield word,sum(occurrences) if __name__ == '__main__': MRWordCounter.run()
Mrjob運行方式
Mrjob支持4種運行方式:內嵌(-r inline)、本地(-r local)、Hadoop(-r hadoop)、Amazon EMR(-r emr)
內嵌
特點是調試方便,啟動單一進程模擬任務執行狀態及結果,Mrjob默認以內嵌方式運行,選項可以不寫。輸出可以用‘>’或‘-o’。下面兩條命令是等價的
#python word_count.py -r inline > output.txt python word_count.py -r inline -o output.txt

"ab" 1 "abc" 2 "ac" 1 "bar" 2 "bc" 1 "bec" 1 "by" 1 "foo" 4 "hadoop" 1 "labs" 2 "me" 1 "python" 2 "quux" 2 "see" 1 "test" 2 "welcome" 1 "you" 1
本地
用於本地模擬Hadoop調試,與內嵌方式的區別是啟動了多進程執行每一個任務
python word_count.py -r local -o output.txt

"ab" 1 "abc" 2 "ac" 1 "bar" 2 "bc" 1 "bec" 1 "by" 1 "foo" 4 "hadoop" 1 "labs" 2 "me" 1 "python" 2 "quux" 2 "see" 1 "test" 2 "welcome" 1 "you" 1
Hadoop
用於Hadoop環境,支持Hadoop運行調度控制參數。
python word_count.py -r hadoop --jobconf mapreduce.job.priority=VREY_HIGH --jobconf mapreduce.job.maps=2 --jobconf mapreduce.job.reduces=1 -o hdfs:///output/hadoop hdfs:///user/hadoop/input #--jobconf mapreduce.job.priority=VREY_HIGH 指定任務調度優先級(VREY_HIGH|HIGH) #--jobconf mapreduce.job.maps=2 Map任務個數限制 #--jobconf mapreduce.job.reduces=1 Reduce任務個數限制

hadoop fs -ls /output/hadoop #查看/output/hadoop下的文件 Found 2 items -rw-r--r-- 1 root supergroup 0 2016-08-23 18:33 /ouput/hadoop/_SUCCESS -rw-r--r-- 1 root supergroup 144 2016-08-23 18:33 /ouput/hadoop/part-00000 hadoop fs -cat /output/hadoop/part-00000 #查看分析結果 "ab" 1 "abc" 2 "ac" 1 "bar" 2 "bc" 1 "bec" 1 "by" 1 "foo" 4 "hadoop" 1 "labs" 2 "me" 1 "python" 2 "quux" 2 "see" 1 "test" 2 "welcome" 1 "you" 1
參考資料:
根據劉天斯《Python自動化運維技術與最佳實踐》整理