本次看的論文是<MapReduce: Simplefied Data Processing on Large Clusters>, 這篇論文描述了Google「三駕馬車」之一的MapReduce。MapReduce 是一個爲了簡化海量數據處理而提出的編程模型與對應框架實現,Hadoop爲其開源實現,是整個大數劇處理的基礎。程序員
MapReduce 是一個用來處理和生成海量數據的編程模型以及一個對應實現。用戶指定Map和Reduce函數:Map 處理一個 Key/Value 對,生成內部的 Key/Value 對集合,Reduce 合併全部相關Key的Key/Vaule對集合。編程
按照這種函數式風格編寫的程序會被自動並行化,調度在大規模的由普通機器組成的集羣上執行。運行時系統負責內部的具體邏輯:如何將輸入數據分區;如何調度程序;處理機器故障;管理必須的機器之間的通訊。這可讓沒有並行編程和分佈式編程經驗的程序員很容易的利用大規模分佈式系統的資源。緩存
MapReduce的實現運行在由普通機器組成的大規模集羣,並且是高可拓展性的:一個典型的MapReduce在成百上千的機器上計算處理TB級別的數據。編程者會發現這個系統很容易去使用:成百上千個MapReduce程序已經被實現,上千個任務天天在Google的集羣上執行。數據結構
MapReduce 的編程模型很簡單,計算任務接收key/value對集合,產生一個key/value對集合,用戶關心的只是如何實現兩個無反作用的函數:Map和Reduce。框架
Map,用戶編寫的函數,接收一個輸入Key/Value對,產生一個內部的Key/
Value對集合。MapReduce庫會把內部Key/Values對按照Key來聚合,而後傳遞給Reduce函數。分佈式
Reduce,也由用戶編寫,接收一個內部Key和這個Key對應的Value集合,它合併那些value來構建一個更小的Value集合。通常每一個Reduce只會有0個或者1個輸出。內部Values集合通常經過迭代器提供給用戶的Reduce函數,這可讓用戶處理超過內存限制的Values集合。函數
接着,論文舉了一個精典的例子Words Count:給定文檔集合,輸出每一個單詞的個數。oop
在MapReduce中,Map 彈出每一個單詞和該單詞的出現次數,Reduce對一個特定的單詞,計算總數。google
MapReduce 程序的類型以下描述:spa
Map (k1, v1) -> list(k2, v2) Reduce (k2, list(v2)) -> list(v2)
在google的C++實現中,只傳遞字符串,由用戶的程序來解析。
接着,論文介紹了幾個更復雜的例子:
1. Distributed Grep 2. Count of URL Access Frequency 3. Reverse Web-Link Graph 4. Term-Vector per Host 5. Inverted Index 6. Distributed Sort
文章第三章主要講述了MapReduce如何實現,包括:執行流程,master的數據結構,以及如何容災,本地性,任務粒度,備份任務。
Map 被分佈在多個機器上,經過自動的對輸入數據分區爲M片,輸入分片能夠被不一樣的機器並行處理。Reduce經過對內部Key空間使用一個分區函數(例如,hash(key) % R)分區爲R片來分佈式。R由用戶指定。
Figure 1展現了MapReduce的操做流程,當用戶程序調用 MapReduce時,執行以下動做:
用戶程序中的MapReduce庫切割輸入文件爲M份,通常爲16~64MB每份,而後在機器上啓動多個程序副本。
副本之一成爲master,其它爲worker,被分配任務。master選擇一個空閒worker,爲其分配一個map/reduce任務。
分配了map task的worker讀取對應輸入文件的分片。它解析輸入文件的Key/Value對,傳遞給用戶定義的Map函數,Map產生的內部Key/Value對緩存在內存(內存放不下怎麼辦?)。
緩存的key/value對週期的寫入到本地磁盤,分區到R個區。這些緩存的key/value對在本地磁盤的位置都傳回給master,master負責轉發這些位置給reduce worker。
當一個 reduce worker 被master通知這些位置時,它使用RPC去讀取map worker的磁盤上的key/value對。當reduce worker讀完全部內部key/value,它根據內部key來排序,全部相同的key的都聚合在一塊兒。若是內部數據過大,就使用外部排序。
Reduce worker迭代排序的內部數據,對於每個不一樣的內部key,它傳遞key和對應的values集合到用戶的Reduce函數。Reduce函數的輸出添加到該分區的最終輸出文件。
當全部map 任務和reduce 任務都完成,master調起用戶程序,從新返回到用戶代碼。
對於每一個map task和reduce task,master 保存它們的狀態(idle,in-process 或者 completed),以及每一個worker機器的標識。
MapReduce 如何容災是其最重要的部分,對於故障咱們能夠分爲 worker故障和master故障,worker故障又能夠分爲 map worker和reduce worker。
Master 經過心跳的機制來檢測worker故障,若是超過必定時間沒有迴應,master就認爲worker故障,worker上的處於 completed 狀態的map task都從新標記爲最初的idle狀態,讓其能夠從新調度到其它機器 。Worker 上的處於 in-progress 狀態的map/reduce task也被重置爲idle。
已經完成的map task被從新執行的緣由是由於它的輸出文件寫在本地磁盤(爲何不寫到gfs)。已經完成的reduce task不用從新執行,由於它將結果寫到gfs。
因此,對於worker故障,MapReduce的處理方式就是從新執行,足夠簡單高效。
論文中介紹,當前實現(2006年時)是停止MapReduce計算任務,Client能夠檢查執行狀況,並決定是否重試。論文也提到,能夠簡單的經過週期寫快照的方式來處理master故障。
爲了應對長尾現象(一個特別慢的子任務拖慢整個任務),MapReduce提供了 Backup Task的機制:當一個MapReduce接近結束時,master 對還處理 in-progress狀態的task額外的調度備份執行,當primary和backup中一個執行成功就標記成功。
1。 Mapreduce 論文是將map的結果寫到本地,爲何不直接寫到gfs?hadoop的對應實現是怎樣的?
2。 「任務序列化」是如何實現的?
2。 文章致謝裏面提到「感謝xx開發集羣管理系統」,論文沒有透露關於這方面的信息。
。