1. 程式人生 > >大資料原理筆記——MapReduce

大資料原理筆記——MapReduce

解決能夠滿足“分而治之”處理要求的場景。處理結果之間不能相互依賴。

map任務之間是不能通訊的,reduce之間也不會發生資訊交換。

處理過程:inputformat,負責資料的輸入,驗證資料格式及檔案切分(split),通過RR(record-reader)過程,根據切片後文件的位置資訊,從hdfs中將檔案讀取出來以K-V的形式傳遞給map,map後的中間結果經過shuffle,對中間結果進行歸併,形成key-value list,傳遞給reduce,經過處理後形成k-v形式的處理結果,經過outputformat的驗證等操作,存放到hdfs上。

split:split是邏輯概念,記錄切分元資訊,如資料起始位置、資料長度、資料所在節點等,切分方式也由使用者決定。而block是物理儲存單位,兩者的切片結果並不保持一致,只是理想的狀態是split的大小與block塊大小 一致。split的數量決定了map任務的數量,map任務的數量過多(split過小)和過少(split過大)均不合適(管理資源佔用、shuffle過程複雜等),需要根據實際情況進行調整,以達到最佳效能。reduce的任務數目取決於叢集中的reduce任務槽(slot)的數目,通常設定reduce任務數比slot數目稍少一些。

shuffle:map過程在處理資料時,先將處理資料以k-v的形式儲存在快取中,當快取區域飽和後,進行溢寫操作,溢寫過程中,會對資料進行分割槽、排序和合並操作,將快取中的資料寫到磁碟上;之後由reduce將各自需要的分割槽資料取走進行歸併操作,再輸入到reduce操作,進行資料處理,最後輸出到hdfs。而資料歸併的過程即是shuffle過程,它包含map和reduce兩端的shuflle。

在map端的shuffle,經過四個步驟:輸入資料到map任務、寫入快取、溢寫(分割槽、排序、合併)、檔案歸併。每個map任務分配一個快取,mr預設100m快取。可以設定溢寫比例,需要小於1,以確保在溢寫過程中新進的資料能夠進入快取,避免資料丟失。溢寫過程中,會預設按照雜湊函式進行分割槽儲存,而後按照key值進行排序操作(預設),排序後的資料可以進行合併(combine)操作,最後寫入磁碟。多個溢寫檔案歸併到大的檔案(已經過分割槽和排序)。combine操作可以設計預定值,當溢件大於預定值時執行combine操作,否則不執行。jobtracker此時一直監控map任務的執行過程,當map過程全部完成後,通知reduce,執行後續操作。

reduce端shuffle,reduce通過RPC向jobtracker詢問map任務狀態,map完成後,reduce認領資料到快取,多個數據先歸併(merge)再合併(combine),寫入磁碟。如果最終檔案大於資料塊,會生成多個歸併檔案,且檔案中鍵值對是排序的,如果資料量很小,則不需要溢寫到磁碟,直接在快取中歸併,並輸出到reduce。

mapreduce執行過程:

1、程式部署,部署到master上,選擇一部分worker執行map一部分執行reduce;

2、分配map任務和reduce任務;

3、mapper讀資料;

4、將map結果寫入快取及本地磁碟(不是hdfs)

5、reducer遠端讀取資料,並執行reduce操作;

6、輸出reduce結果

mapreduce可以用於關係代數運算(選擇、並、交、差、連線等)、分組與聚合運算、矩陣-向量乘法和矩陣乘法。