一、簡介
1、mapreduce 應用廣泛的原因之一在于它的易用性。它提供了一個因高度抽象化而變得異常簡單的程式設計模型。
2、從mapreduce 自身的命名特點可以看出,mapreduce 由兩個階段組成:map 和reduce 。使用者隻需編寫map( ) 和reduce( ) 兩個函數,即可完成簡單的分布式程式的設計。
1)map ( ) 函數以key/value 對作為輸入,産生另外一系列key/value 對作為中間輸出寫入本地磁盤。mapreduce 架構會自動将這些中間資料按照k e y 值進行聚集,且k e y 值相同(使用者可設定聚集政策,預設情況下是對k e y 值進行哈希取模)的資料被統一交給reduce( ) 函數處理。
2)reduce( ) 函數以k e y 及對應的v a l u e 清單作為輸入,經合并k e y 相同的v a l u e 值後,産生另外一系列key/value 對作為最終輸出寫入h d f s 。
二、執行個體
下面以mapreduce 中的“hello world ”程式—word count 為例介紹程式設計方法。
其中m a p 部分如下:
r e d u c e 部分如下:
ps
1、使用者編寫完mapreduce 程式後,按照一定的規則指定程式的輸入和輸出目錄,并送出到hadoop 叢集中。作業在hadoop 中的執行過程如圖1所示。hadoop 将輸入資料切分
成若幹個輸入分片(input split ,後面簡稱split ),并将每個split 交給一個map task 處理;map task 不斷地從對應的split 中解析出一個個key/value ,并調用m a p ( ) 函數處理,處理完
之後根據reduce task 個數将結果分成若幹個分片(partition )寫到本地磁盤;同時,每個reduce ta s k 從每個m a p ta s k 上讀取屬于自己的那個partition ,然後使用基于排序的方法将
key 相同的資料聚集在一起,調用reduce ( ) 函數處理,并将結果輸出到檔案中。
圖1 word count 程式運作過程
2、上面的程式還缺少三個基本的元件,功能分别是:
①指定輸入檔案格式。将輸入資料切分成若幹個s p l i t ,且将每個s p l i t 中的資料解析成一個個m a p ( ) 函數要求的k e y / v a l u e 對。
②确定m a p ( ) 函數産生的每個k e y / v a l u e 對發給哪個r e d u c e ta s k 函數處理。
③指定輸出檔案格式,即每個k e y / v a l u e 對以何種形式儲存到輸出檔案中。
在hadoop mapreduce 中,這三個元件分别是inputformat 、partitioner 和outputformat ,它們均需要使用者根據自己的應用需求配置。而對于上面的wo r d c o u n t 例子,預設情況下hadoop 采用的預設實作正好可以滿足要求,因而不必再提供。
綜上所述,hadoop mapreduce 對外提供了5 個可程式設計元件,分别是inputformat 、m a p p e r 、partitioner 、reducer 和outputformat 。
三、hadoop mapreduce 作業的生命周期
本節主要講解hadoop mapreduce 作業的生命周期,即作業從送出到運作結束經曆的整個過程。本節隻是概要性地介紹mapreduce 作業的生命周期;
假設使用者編寫了一個mapreduce 程式,并将其打包成x x x . j a r 檔案,然後使用以下命
令送出作業:
則該作業的運作過程如圖2所示。
這個過程分為以下5 個步驟:
步驟1 作業送出與初始化。使用者送出作業後,首先由jobclient 執行個體将作業相關資訊,比如将程式jar 包、作業配置檔案、分片元資訊檔案等上傳到分布式檔案系統(一般為h d f s )上,其中,分片元資訊檔案記錄了每個輸入分片的邏輯位置資訊。然後jobclient通過r p c 通知jobtracker 。jobtracker 收到新作業送出請求後,由作業排程子產品對作業進行初始化:為作業建立一個j o b i n p r o g r e
s s 對象以跟蹤作業運作狀況,而j o b i n p r o g r e s s 則會為每個ta s k 建立一個taskinprogress 對象以跟蹤每個任務的運作狀态,taskinprogress 可能需要管理多個“ta s k 運作嘗試”(稱為“ta s k a t t e m p t ”)。
步驟2 任務排程與監控。前面提到,任務排程和監控的功能均由jobtracker 完成。tasktracker 周期性地通過h e a r t b e a t 向jobtracker 彙報本節點的資源使用情況,一旦出現
空閑資源,jobtracker 會按照一定的政策選擇一個合适的任務使用該空閑資源,這由任務排程器完成。任務排程器是一個可插拔的獨立子產品,且為雙層架構,即首先選擇作業,然後
從該作業中選擇任務,其中,選擇任務時需要重點考慮資料本地性。此外,jobtracker 跟蹤作業的整個運作過程,并為作業的成功運作提供全方位的保障。首先,當tasktracker 或者ta s k 失敗時,轉移計算任務;其次,當某個ta s k 執行進度遠落後于同一作業的其他ta s k 時,為之啟動一個相同ta s k ,并選取計算快的ta s k 結果作為最終結果。
步驟3 任務運作環境準備。運作環境準備包括j v m 啟動和資源隔離,均由tasktracker 實作。tasktracker 為每個ta s k 啟動一個獨立的j v m 以避免不同ta s k 在運作過程中互相影響;同時,tasktracker 使用了作業系統程序實作資源隔離以防止ta s k 濫用資源。
步驟4 任務執行。tasktracker 為ta s k 準備好運作環境後,便會啟動ta s k 。在運作過程中,每個ta s k 的最新進度首先由ta s k 通過r p c 彙報給tasktracker ,再由tasktracker彙報給jobtracker 。
步驟5 作業完成。待所有ta s k 執行完畢後,整個作業執行成功。
圖2 hadoop mapreduce 作業的生命周期
四、mapreduce 程式設計模型的實作
1、mapreduce 程式設計模型給出了其分布式程式設計方法,共分5 個步驟:
1 )疊代(iteration )。周遊輸入資料,并将之解析成key/value 對。
2 )将輸入key/value 對映射(m a p )成另外一些key/value 對。
3 )依據k e y 對中間資料進行分組(grouping )。
4 )以組為機關對資料進行歸約(reduce )。
5 )疊代。将最終産生的key/value 對儲存到輸出檔案中。
mapreduce 将計算過程分解成以上5 個步驟帶來的最大好處是元件化與并行化。為了實作mapreduce 程式設計模型,hadoop 設計了一系列對外程式設計接口。使用者可通過實作這些接口完成應用程式的開發。
2、mapreduce 程式設計接口體系結構
mapreduce 程式設計模型對外提供的程式設計接口體系結構如圖3 所示,整個程式設計模型位于應用程式層和mapreduce 執行器之間,可以分為兩層。第一層是最基本的j a v a a p i ,主要有5 個可程式設計元件,分别是inputformat 、mapper 、partitioner 、reduce r 和outputformat 。
hadoop 自帶了很多直接可用的inputformat 、partitioner 和outputformat ,大部分情況下,使用者隻需編寫mapper 和reducer 即可。第二層是工具層,位于基本j a v a a p i 之上,主要是為了友善使用者編寫複雜的mapreduce 程式和利用其他程式設計語言增加mapreduce 計算平台的相容性而提出來的。在該層中,主要提供了4 個程式設計工具包。
j o b c o n t r o l
:友善使用者編寫有依賴關系的作業,這些作業往往構成一個有向圖,是以 通常稱為dag (directed acyclic graph )作業,如第2 章中的樸素貝葉斯分類算法實作便是4 個有依賴關系的作業構成的dag 。
c h a i n mapper / chain reduce r :友善使用者編寫鍊式作業,即在m a p 或者reduce 階段存在多個mapper ,形式如下:
[mapper+ reducer mapper*]
hadoop streaming :友善使用者采用非j a v a 語言編寫作業,允許使用者指定可執行檔案或者腳本作為mapper / reduce r 。
hadoop pipes :專門為c / c + + 程式員編寫mapreduce 程式提供的工具包。
圖3 mapreduce 程式設計接口體系結構
五、小結:
1、hadoop mapreduce 直接誕生于搜尋領域,以易于程式設計、良好的擴充性和高容錯性為設計目标。它主要由兩部分組成:程式設計模型和運作時環境。其中,程式設計模型為使用者提供了5
個可程式設計元件,分别是inputformat 、mapper 、partitioner 、reduce r 和outputformat ;運作時環境則将使用者的mapreduce 程式部署到叢集的各個節點上,并通過各種機制保證其成功
運作。
2、hadoop mapreduce 處理的資料一般位于底層分布式檔案系統中。該系統往往将使用者的檔案切分成若幹個固定大小的block 存儲到不同節點上。預設情況下,mapreduce 的每
個task 處理一個block 。 mapreduce 主要由四個元件構成,分别是c l i e n t 、jobtracker 、tasktracker 和ta s k ,它們共同保障一個作業的成功運作。一個mapreduce 作業的運作周期是,先在c l i e n t 端被送出jobtracker 上,然後由jobtracker 将作業分解成若幹個ta s k ,并對這些ta s k 進行排程和監控,以保障這些程式運作成功,而tasktracker 則啟動jobtracker 發來的ta s k ,并向jobtracker
彙報這些task 的運作狀态和本節點上資源的使用情況。