學習Hadoop——MapReduce介紹
MapReduce是一種程式設計模型,用於大規模資料的並行運算,它極大的方便程式設計人員在不會分散式程式設計的情況下,將自己的程式執行在分散式系統上。在軟體實現是通過指定一個Map(對映)函式,把一組鍵值對對映成一組新的鍵值對,指定併發的Reduce(規約)函式,來保證所有對映的鍵值對的每一個共享相同的鍵組。
易於程式設計;良好的擴充套件性;高容錯性,適合PB級以上海量資料的離線處理
應用場景:
(1).簡單的資料統計,比如網站PV,統計
(2).搜尋引擎索引
(3).海量資料查詢
(4).複雜資料分析演算法實現:聚類演算法,分類演算法,推薦演算法,圖演算法
高容錯性:交給一個節點出錯時,轉移到其他節點
離線處理:批量處理
MapReduce限制:
不適合實時計算
不適合流式計算
不適合DAG計算
程式設計模型:WordCount
輸入—>切分—>鍵值對—>shuffing(歸約)—>reducing—>formal result
input splitting mapping
shuffing:相同的鍵值整理在一起
reducing:將歸約好的輸出(相同鍵的值加起來)
將分片資料解析成鍵值對:
TextInputFormal Block Split 短應用程式
1.MapReduce 庫先把User Program 的輸入檔案劃分為M份,每一份通常有16MB,上圖所示為split0-4,然後使用fork將使用者程序拷貝到叢集內其他機器上。
2.User Program 的中有一個副本稱為master,其餘稱為worker,master是負載排程的,為空閒worker分配作業,worker的數量也是有使用者指定的。
3.被分配的Map作業的worker 開始讀取對應分片的輸入資料,Map作業數量由Master決定,和split一一對應,Map作業從輸入資料中抽取鍵值對,每一個鍵值對都作為引數傳遞給map函式,map函式產生的鍵值對被快取在記憶體中。
4.快取的中間值會被定期寫入本地磁碟,而且被分為R個區,R的大小由使用者定義的,將來每個區會對應一個Reduce作業;這些中間值對應的位置會通報給Master,Master負責將資訊發給Reduce worker。
5.Master通知分配了Reduce作業的worker它負責的分割槽在什麼位置,當Reduce worker把所有它負責的中間鍵值對都讀取過來後,先對它們進行排序,是的相同的鍵值對聚集在一起。因為不同的鍵值可能對映到同一個分割槽也就是同一個Reduce作業上,所以排序必須的。
6.Reduce worker 遍歷排序後的中間鍵值對,對於每個唯一的鍵,都將鍵與關聯的值傳遞給reduce 函式,reduce函式產生的輸出
會新增到這個分割槽的輸出檔案中。
7.當所有的Map 和Reduce 作業完成後,Master 負責將MapReduce函式呼叫的結果返回給User Program 的程式碼。
上述過程執行完成後,MapReduce 輸出放在R個分割槽的輸出檔案中。使用者通常並不需要合併這R檔案,而是將其作為輸入交給另一個MapReduce 程式處理。整個過程中,輸入資料來自底層分散式檔案系統(HDFS)的,中間資料放在本地檔案系統,最終輸出資料寫入底層分散式檔案系統(HDFS)的。
Map/Reduce作業和Map/Reduce函式的區別:Map作業處理一個輸入資料的分片可能需要呼叫多次Map函式來處理每個輸入鍵值對;Reduce 作業處理一個分割槽的中間鍵值對,期間要對每個不同的鍵呼叫reduce函式,Reduce作業最終也對應輸出檔案