Hadoop:使用Mrjob框架編寫MapReduce


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自動化運維技術與最佳實踐》整理

 


免責聲明!

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



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