大資料之六 hadoop MapReduce原理

2021-08-29 04:10:51 字數 2300 閱讀 3597

mapreduce是hadoop四大元件之一(hdfs,mapreduce,yarn和comment),是一種分布式計算程式設計模型,用於解決海量資料的計算問題。

mapreduce採用分而治之的思想,將大檔案切割成片,然後由多個map task並行處理,處理完成後交由reduce再做合併,最後輸出結果

這裡我們以經典例子wordcount(詞頻分析)來進行說明

首先將大檔案切割成片(片的大小預設與block等同,由於中文使用utf8儲存佔3個位元組,所以切割時具體大小可能會有所波動),這裡我們假設切割成了兩個split切片,開啟兩個map task和兩個reduce task。

那麼接下來,乙個map task負責處理乙個切片,首先從split切片中讀取資料,設定按行讀取,讀出來為乙個對,這裡的k1預設為偏移量,如下圖,讀出的資料即為<0,「hello world」> <13,「hello hadoop」>,注意每行有個換行符。

讀出來的資料將進入map進行處理,在map處理中,資料會依照需求轉換為新的對,這裡因為我們要做詞頻統計,所以將v1分割成單個單詞,新的k2使用單詞本身,而value定為1,表示其出現了一次,如下圖,新的即為。

到這裡map處理就完成了,接下來是shuffle write,將資料寫入到本地磁碟(而不是hdfs,因為這只是中間資料,使用完後會直接刪除)

在map處理完成之後,我們先將資料以對的形式寫到乙個100m的buffer(乙個環形記憶體緩衝器,閾值0.8)中,在寫入之前會先對其進行分割槽處理,分割槽預設由hashpartitioner來執行(根據實際job我們可以自定義分割槽器),規則是k2的hash值與reduce task的個數取模,hash(k2)%reduce.num,這樣這些資料就會被分為reduce.num個分割槽。此時資料由3部分組成:分割槽號,。

這裡有2個reduce task,所以會有兩個分割槽0分割槽和1分割槽,最後所有0分割槽的資料會送到同乙個reduce task上進行處理,所有1分割槽的資料會送到另乙個reduce task上處理。

分割槽完成後寫入buffer,隨著資料不斷寫入,當寫滿80m時,這80m記憶體會被封鎖,然後對其中資料進行排序,分組和combiner(小聚合)。

排序主要是按照分割槽號和key值進行。這裡key值是字串,所以按照asii碼排序,根據實際job需求我們可以自定義排序方式。排完序資料為

分組指的是相同key的value放到乙個集合中,分完組後資料為

分組和排序都是為了提高後面reduce處理時的分組效率

combiner是可選的,預設不執行,因為並不是所有的job都適用combiner。combiner的作用是對map端的輸出先做一次合併(迷你reduce),以減少在map和reduce節點之間的資料傳輸量,提高網路io效能。combiner後的資料為

以上步驟完成後將資料溢寫到磁碟,完成期間資料寫入剩餘的20m中,防止阻塞。

從buffer溢寫出來的檔案皆是小檔案,其內部已經按照分割槽號分好區且每個分區內資料有序,為了之後reduce方便處理,我們將所有小檔案歸併成乙個大檔案,歸併時使用歸併排序,確保大檔案也是有序的

在reduce執行之前,是shuffle read階段。

首先reduce task詢問map任務是否已經完成,若完成,reduce task所在的節點去map端讀取資料,即上面最終形成的大檔案(這裡可以看出map task和reduce task最好在同一節點上,這樣可以將網路io變成磁碟io,效率更高)。因為上面的檔案是分好區的,所以對應的reduce task只需讀對應分割槽的資料即可,如reduce task0唯讀大檔案中0號分割槽的資料。

將資料讀取到記憶體中,同樣記憶體達到閾值就會溢寫,溢寫前會做排序處理,這裡按key值排序就可以了。溢寫後形成一些小檔案,當資料全部讀取完成後,將小檔案歸併排序成乙個大檔案。

reduce的核心思想:將「相同」key值資料為一組呼叫一次reduce方法

reduce對大檔案進行分組,可根據實際情況自定義分組條件,這裡以相同key值的為一組。因為前面所做的排序和分組,這裡的分組就可以更快速簡單的完成,然後按組讀取檔案,一組資料呼叫一次reduce方法,產生結果寫入hdfs上的output檔案中

可上九天攬月,可下五洋捉鱉,談笑凱歌還。世上無難事,只要肯登攀。

大資料學習之《早課六》

早課題 1.後台執行指令碼的命令哪幾個?nohup screen 2.定時每隔五分鐘執行指令碼,命令是什麼 編輯引數是什麼 編輯計畫任務 crontab e 5 b.sh 3.切換使用者,帶執行環境變數檔案命令是什麼 su 使用者名稱 4.沒有臨時root許可權,需要修改哪個配置檔案,新增哪行?et...

大資料 SparkStreaming(六)

利用wal把資料寫入到hdfs中 步驟一 設定checkpoint目錄 streamingcontext.setcheckpoint hdfsdirectory 步驟二 開啟wal日誌 sparkconf.set spark.streaming.receiver.writeaheadlog.enab...

大資料實戰之環境搭建 六

這篇我們看如何搭建solr,因為第一篇講述了在windows下如何搭建,所以這裡就簡單的說一下。前面已經提到我們將solr壓縮包拷貝至了usr tmp下。之後我們將solr解壓目錄下面的example solr拷貝到上面solr 4.3.0下 ok,完了之後進行我們的最後一步,在tomcat下面的 ...