亞馬遜Web服務(wù)的彈性MapReduce是一項(xiàng)基于Hadoop的實(shí)施,它可允許你運(yùn)行大型的預(yù)處理工作,如格式轉(zhuǎn)換和數(shù)據(jù)聚合等。雖然我們可以選擇很多的編程語(yǔ)言來(lái)對(duì)這些任務(wù)進(jìn)行編碼,但是時(shí)間緊張的開(kāi)發(fā)人員更需要一個(gè)能夠最大限度減少編碼開(kāi)銷的編程框架。 Mrjob、 Dumbo 以及 PyDoop 是三個(gè)基于Python可滿足以上需求的彈性MapReduce框架。
那么,為什么諸如Java或Apache Pig之類的流行編程語(yǔ)言無(wú)法勝任這項(xiàng)任務(wù)呢?亞馬遜的彈性MapReduce(EMR)任務(wù)一般都是采用Java語(yǔ)言編寫(xiě)的,但即便是簡(jiǎn)單的應(yīng)用程序也可能需要比用Python開(kāi)發(fā)的腳本程序更多的代碼行。 Pig 是一種專為載入和轉(zhuǎn)換數(shù)據(jù)的應(yīng)用而設(shè)計(jì)的高級(jí)數(shù)據(jù)處理語(yǔ)言,但是這并不是一種通用的編程語(yǔ)言。
如果開(kāi)發(fā)人員一方面比較喜歡使用比Java更高級(jí)的編程語(yǔ)言,一方面又需要使用比Pig數(shù)據(jù)管理更多的功能,那么他們應(yīng)當(dāng)嘗試使用下Python。 目前,有三種基于Python的EMR框架可供選擇: Mrjob、Dumbo 以及 PyDoop。
mrjob開(kāi)源開(kāi)發(fā)包
Mrjob是一種可在亞馬遜EMR上或在你的本地機(jī)器上運(yùn)行任務(wù)的開(kāi)源包。 彈性MapReduce任務(wù)是在單個(gè)Python類中定義的,而其中包含了與mappers、reducers以及combiners相關(guān)的方法。
Hadoop的大部分較低層次詳細(xì)信息都隱藏在mrjob抽象操作下,這是有好處的。 這個(gè)簡(jiǎn)化的模式可允許開(kāi)發(fā)人員把主要精力關(guān)注在map-reduce功能的邏輯設(shè)計(jì)上。 但是,這卻意味著你將受制于Hadoop API的一個(gè)子集。 如果你需要訪問(wèn)更多的Hadoop API,那么Dumbo 或 PyDoop可能是一個(gè)更好的選擇。
使用mrjob的一個(gè)重要優(yōu)點(diǎn)就是,它不需要安裝Hadoop。 開(kāi)發(fā)人員可以在一臺(tái)單一設(shè)備上使用Python、mrjob以及其他來(lái)編寫(xiě)、測(cè)試和調(diào)試彈性MapReduce程序。 一旦程序準(zhǔn)備就緒,你就可以將其移植至EMR,而相同的代碼可在Hadoop集群上正常運(yùn)行且無(wú)需任何修改。 承載5700萬(wàn)評(píng)論、每月1.3億以上游客瀏覽的社交網(wǎng)絡(luò)仍然使用著mrjob,因此它可滿足眾多Hadoop用戶的需求。
使用Dumo進(jìn)行作業(yè)處理
Dumbo是另一個(gè)支持EMR的Python框架。 與mrjob類似,你可以編寫(xiě)mapper類和reducer類來(lái)實(shí)施彈性MapReduce任務(wù)。 除了在mrjob中的基本功能以外,Dumbo還提供了更多的任務(wù)處理選項(xiàng)。 它的一個(gè)任務(wù)類可允許開(kāi)發(fā)人員定義多組由單一命令運(yùn)行的map-reduce操作。 當(dāng)對(duì)一個(gè)數(shù)據(jù)集執(zhí)行多個(gè)操作時(shí),這是非常有用的。
Dumbo支持文本和序列文件格式,而通過(guò)使用用戶指定的Java類,它還支持用戶的自定義格式。 在缺點(diǎn)方面,Dumbo的相關(guān)文檔較少,尤其是與mrjob的技術(shù)文檔相比。
Dumbo遵循著MapReduce的范式,因此在這個(gè)框架下進(jìn)行核心組件開(kāi)發(fā)與在mrjob和PyDoop中進(jìn)行開(kāi)發(fā)是類似的。 它還允許你執(zhí)行partitioners,除了是在本地運(yùn)行外,它與reducers類似。 它們能夠減少map與reduce操作之間數(shù)據(jù)的傳輸量。
通過(guò)使用Dumbo,開(kāi)發(fā)人員還可以在啟動(dòng)任務(wù)時(shí)以命令行的方式控制Hadoop參數(shù)。 Hadoop默認(rèn)使用純文本的文件格式,但是用戶可以通過(guò)指定一個(gè)自定義的RecordReader類來(lái)處理其他的格式。 這個(gè)類包括了初始化、下一步、關(guān)閉以及getProgress等方法。
它還支持Hadoop文件系統(tǒng)API,它連接了一個(gè)HDFS安裝和讀寫(xiě)文件。 此外,API會(huì)檢索文件、目錄以及文件系統(tǒng)中的元數(shù)據(jù)。 當(dāng)你需要以較低層次方式訪問(wèn)文件系統(tǒng)時(shí),Dumbo API可以助你一臂之力,因?yàn)樗信cHDFS API相同的功能集。
使用PyDoop進(jìn)行研究包訪問(wèn)
需要訪問(wèn)第三方庫(kù)和軟件包的Python開(kāi)發(fā)人員可能需要考慮使用PyDoop。 CRS4跨學(xué)科研究中心開(kāi)發(fā)了這個(gè)框架并對(duì)其進(jìn)行了維護(hù)。 這樣做的一個(gè)好處就是,你可以對(duì)訪問(wèn)流行Python研究包(例如SciPy)進(jìn)行計(jì)數(shù)。
盡管mrjob、Dumbo以及PyDoop框架都具有不少的好處,但是它們都會(huì)增加運(yùn)行開(kāi)銷,因此與用Java語(yǔ)言進(jìn)行開(kāi)發(fā)或者通過(guò)Hadoop流相比,你的任務(wù)的運(yùn)行時(shí)間有可能會(huì)變得更長(zhǎng)。 如果確保EMR的低成本是一個(gè)關(guān)鍵的考慮因素,那么比較分別用Python流和其他框架開(kāi)發(fā)的MapReduce任務(wù)就可以得知運(yùn)行任務(wù)所需的額外時(shí)間了。
當(dāng)你開(kāi)發(fā)一些EMR任務(wù)時(shí),Hadoop的Python框架是有用的。 這三個(gè)開(kāi)發(fā)框架都可以在彈性MapReduce上正常運(yùn)行,并能夠幫助用戶避免不必要的和繁瑣的Java開(kāi)發(fā)工作。 當(dāng)你需要更多地訪問(wèn)Hadoop內(nèi)部時(shí),可考慮Dumbo或PyDoop。