上圖是論文里給出的流程圖。一切都是從最上方的user program開始的,user program鏈接了MapReduce庫,實現(xiàn)了最基本的Map函數(shù)和Reduce函數(shù)。圖中執(zhí)行的順序都用數(shù)字標記了。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了泗水免費建站歡迎大家使用!
1.MapReduce庫先把user program的輸入文件劃分為M份(M為用戶定義),每一份通常有16MB到64MB,如圖左方所示分成了split0~4;然后使用fork將用戶進程拷貝到集群內(nèi)其它機器上。
2.user program的副本中有一個稱為master,其余稱為worker,master是負責調(diào)度的,為空閑worker分配作業(yè)(Map作業(yè)或者Reduce作業(yè)),worker的數(shù)量也是可以由用戶指定的。
3.被分配了Map作業(yè)的worker,開始讀取對應分片的輸入數(shù)據(jù),Map作業(yè)數(shù)量是由M決定的,和split一一對應;Map作業(yè)從輸入數(shù)據(jù)中抽取出鍵值對,每一個鍵值對都作為參數(shù)傳遞給map函數(shù),map函數(shù)產(chǎn)生的中間鍵值對被緩存在內(nèi)存中。
4.緩存的中間鍵值對會被定期寫入本地磁盤,而且被分為R個區(qū),R的大小是由用戶定義的,將來每個區(qū)會對應一個Reduce作業(yè);這些中間鍵值對的位置會被通報給master,master負責將信息轉(zhuǎn)發(fā)給Reduce worker。
5.master通知分配了Reduce作業(yè)的worker它負責的分區(qū)在什么位置(肯定不止一個地方,每個Map作業(yè)產(chǎn)生的中間鍵值對都可能映射到所有R個不同分區(qū)),當Reduce worker把所有它負責的中間鍵值對都讀過來后,先對它們進行排序,使得相同鍵的鍵值對聚集在一起。因為不同的鍵可能會映射到同一個分區(qū)也就是同一個Reduce作業(yè)(誰讓分區(qū)少呢),所以排序是必須的。
6.reduce worker遍歷排序后的中間鍵值對,對于每個唯一的鍵,都將鍵與關(guān)聯(lián)的值傳遞給reduce函數(shù),reduce函數(shù)產(chǎn)生的輸出會添加到這個分區(qū)的輸出文件中。
6.當所有的Map和Reduce作業(yè)都完成了,master喚醒正版的user program,MapReduce函數(shù)調(diào)用返回user program的代碼。
所有執(zhí)行完畢后,MapReduce輸出放在了R個分區(qū)的輸出文件中(分別對應一個Reduce作業(yè))。用戶通常并不需要合并這R個文件,而是將其作為輸入交給另一個MapReduce程序處理。整個過程中,輸入數(shù)據(jù)是來自底層分布式文件系統(tǒng)(GFS)的,中間數(shù)據(jù)是放在本地文件系統(tǒng)的,最終輸出數(shù)據(jù)是寫入底層分布式文件系統(tǒng)(GFS)的。而且我們要注意Map/Reduce作業(yè)和map/reduce函數(shù)的區(qū)別:Map作業(yè)處理一個輸入數(shù)據(jù)的分片,可能需要調(diào)用多次map函數(shù)來處理每個輸入鍵值對;Reduce作業(yè)處理一個分區(qū)的中間鍵值對,期間要對每個不同的鍵調(diào)用一次reduce函數(shù),Reduce作業(yè)最終也對應一個輸出文件。
注意:map函數(shù)與reduce函數(shù)之間存在一個排序算法,該排序算法的作用是將所有擁有相同鍵的值聚合在一起,將聚合在一起的鍵-值作為reduce函數(shù)的參數(shù)。