傳統的MapReduce架構是google於2004年在論文:“MapReduce: Simplified Data Processing on Large Clusters”提出的,該架構把一些資料密集型應用的資料處理過程簡化抽象成map和reduce兩個階段,使用者在設計分布式程式時,只要實現map()和reduce()兩個函數,至於其它細節,例如資料分區,任務調度,機器容錯,機器間通訊等,都交由MapReduce架構處理。隨著技術的發展,在傳統MapReduce架構的基礎上,出現了一些針對特殊應用的MapReduce架構,主要有以下幾種:
(1) 支援迭代MapReduce的Twister和Haloop(參見我的博文:迭代式MapReduce架構介紹).
(2) 支援多階段流式計算的Sector/Sphere(參見我的博文:流式MapReduce實現Sector/Sphere ).
(3) 支援DAG(Directed Acyclic Graph)的Dryad和Cascading(參見文章:Dryad , Cascading 以及Cascading的首頁).
(4) MapReduce與Database結合的產物:HadoopDB 和 greenplum.
本文主要講解當下較為出名的傳統MapReduce開源實現。現在有非常多的開源MapReduce架構實現, 最出名的莫過於Java實現版本Hadoop。 實際上,它屬於重量級的實現版本(代碼量大),要理解其細節或者對其進行改進需要很大工作量。 為了克服重量級實現存在的缺陷,一些輕量級的版本出現了,如erlang實現版本Disco,Python實現版本micemeat,bash版本bashreduce等。
本文主要介紹Disco,粗略講解micemeat和bashreduce。
傳統MapReduce實現之Disco
1、概述
Disco是一個輕量級的MapReduce架構實現,核心模組使用Erlang語言實現,外部介面為易於編程的Python。同Hadoop一樣,擁也有自己的Distributed File SystemDDFS,不過DDFS是與計算架構高度耦合的。 Disco由諾基亞研究中心開發,用於處理實際應用中的大規模資料。
2、Disco的總體設計架構
Disco由分布式儲存系統DDFS(Disco Distributed File System)和MapReduce架構組成,本節主要介紹Disco的總體設計架構,下面一節介紹DDFS。
Disco也是master/slave架構:
Disco master從client端接收作業,並將它們添加到作業隊列中,以便進行調度。
Client processes是一些python程式,它們使用函數disco.job()向master提交作業。
Worker supervision是由master啟動的,每個節點啟動一個,用於監控該節點上python worker的運行情況。
Python worker用於執行使用者提交的作業。
輸入檔案是通過http擷取的,但若要讀取的檔案在本地,直接從磁碟上擷取即可。為了能夠從個遠程節點上擷取資料,每個節點上進行一個httpd後台進程。
3、DDFS的架構
DDFS是嵌入到Disco中的,目前只有一個master節點(存在單點故障)。每個儲存節點由一組磁碟或者卷宗組成(vol0..volN),它們分別掛載在$DDFS_ROOT/vol0 … $DDFS_ROOT/volN。每個卷宗下面有兩個檔案,分別為tag 和 blob,分別用於儲存標記(tag,相當於key)和標記對應的值(value)。DDFS會監控每個節點上的磁碟使用方式,並每隔一段時間進行負載平衡。
4、分布式索引Discodex
Discodex是專門為Disco設計的分布式索引系統。
Discodex實際上是一個分布式key/value儲存系統。通過某一個key,可以檢索出與該key相關的所有value。Discodex對外提供了一些ReST API,使用者通過這些API檢索資料。
當我們使用Discodex時,實際上是運行了一個HTTP 伺服器,它把ReSTful url映射成Disco作業。 Discodex在DDFS上儲存key和value值,其中每個檔案都是分布式的,稱為index,chunks或者ichunks。
5、參考資料
(1)官方網址:http://discoproject.org/
(2)安裝方法:http://blog.csdn.net/socrates/archive/2009/05/26/4217641.aspx
傳統MapReduce實現之micemeat
1、介紹
micemeat是MapReduce的python實現,整個代碼由一個python檔案構成(<13KB),它僅依賴於python標準庫,非常容易部署,同時它還支援以下功能:
(1) 容錯:任何一個slave可以隨時加入或者離開叢集而不會影響其他slave。
(2) 安全:micemeat會對每一條串連進行授權驗證,防止未經授權的代碼被執行。
2、參考資料:
官方網址:http://remembersaurus.com/mincemeatpy/
傳統MapReduce實現之bashreduce
1、 介紹
Bashreduce採用bash指令碼語言編寫,整合了常用的shell命令,如sort, awk, ssh, netcat等。目前僅在ubuntu/debian系統上進行了測試。
2、 參考資料
(1) https://github.com/erikfrey/bashreduce
另外,還有Perl實現RobotArmy和ruby實現skyner
參考資料:
(1) RobotArmy官方首頁:http://bulletsweetp.github.com/robotarmy/
(2) RobotArmy論文:RobotArmy: A Casual Framework for Massive Distributed Processing
(3) Skynet官方首頁:http://skynet.rubyforge.org/
原創文章,轉載請註明: 轉載自董的部落格
本文連結地址: http://dongxicheng.org/mapreduce/traditional-mapreduce-framework/