亞寵展、全球寵物產業風向標——亞洲寵物展覽會深度解析
886
2025-04-02
大數據處理目前比較流行的是兩種方法,一種是離線處理,一種是在線處理。
在互聯網應用中,不管是哪一種處理方式,其基本的數據來源都是日志數據,例如對于web應用來說,可能是用戶的訪問、點擊日志等。
如果對于數據的分析結果在時間上有比較嚴格的要求,則可以采用在線處理的方式。比如雙十一的成交額需要實時動態進行更新的,對于這種情況,可以使用Spark、Storm等進行在線處理。
當然,如果只是希望得到數據的分析結果,對處理的時間要求不嚴格,就可以采用離線處理的方式,比如我們可以先將日志數據采集到HDFS中,之后再進一步使用MapReduce來對數據進行分析。
MapReduce是Hadoop平臺的基礎組件之一,它是一個分布式的計算框架,用于大數據的離線計算,和HDFS、YARN搭配使用。
MapReduce主要分為切片File、Map、shuffle和Reduce四個階段。本文主要以一個撲克牌的類比案例,來詳細聊聊MapReduce的工作原理。
MapReduce的原理和洗牌一樣簡單
IT的智慧體現在算法上,而算法的靈感就來源于生活。
想要理解MapReduce做離線計算到底是怎么回事,也得從生活中找到答案。
現在有兩幅撲克牌無序的堆成一摞放在桌子上,四個人玩牌,玩牌之前他們要看看每一種花色的牌是否完整?請問大家,用什么方式最快?
——正確答案:把牌分成4摞,每個人拿一摞,拿到牌之后每個人把自己手里的牌按照紅黑花梅的花色分堆,大家都分好之后再按照花色把四個人手中的牌整合到一起。紅桃一摞,黑桃一摞,以此類推。
到此為止,我們就已經成功的將兩幅混亂的撲克牌按花色分成四摞了,然后每個人去這四摞牌里面拿到一種花色,從最小排到最大,去清點自己手里的花色是否完整。
其實這就是一個離線計算的過程。
離線計算的過程分為兩個階段,首先是Map的階段,就是我們最開始的時候把混亂的撲克牌分成4摞,每個人去拿一摞將其一張張分開的過程。分開之后,我們檢查花色,并且按照花色將其分堆,這就是一個Partition的過程。
Partition完成之后呢?我們每個人的手上保存了4摞分好了花色的牌,這時候就進入Reduce階段,進入Reduce階段之后又做些什么呢?
首先要把每個人手里分好的牌按照花色整合到一起,然后再對整合好的每一摞牌進行檢查,最后分別輸出檢查結果。
我們具體拿一些數據來分析一下這個過程。
input是我們要處理的數據,這是一個文本文檔。我們把它送到MapReduce模塊里邊,需要得到如右邊所示的結果:統計出來每個單詞出現的詞數。
MapReduce怎么做呢?
既然是集群模式,肯定要把任務分配給不同的服務器。假設我現在把文件分成3塊,就會在集群當中啟動3個Map進程。每個進程拿到一塊數據,接下來它會怎么做呢?
——正確答案:Map要對拿到的數據做一個處理,然后每個Map把處理結果交給Reduce,讓Reduce去做一個統計。所以,Map先會將一行數據按空格鍵切分,變成若干個單詞,然后單詞每出現一次,計數為1,用一個鍵值對裝起來,如下圖:
在數據量很多的情況下,我們一般會讓Map做單詞的統計。
因為如果不做單詞統計的話,它就會把這一堆
所以Map會把每一個單詞出現了多少次統計出來,比如hello出現了1次,world出現了2次。最后每個Map將手頭的任務計算完畢就把結果存儲起來,接下來就輪到Reduce上場。
在Map存儲結果的過程中,Reduce會被啟動,同時去拿Map處理的結果,當有多個Reduce的時候,Reduce不會把全部的結果都讀取回來,而是只讀取屬于自己的分區,即分區Partition。
什么叫做分區呢?
分區就是對Map計算的結果做的一個分類,有多少Reduce,我就把結果分成多少類,也就是多少個分區。這是通過一個算法來完成的,這個算法是怎么回事,我們后面會做一個細節補充。
我們先以4個Reduce為例(一般情況下Reduce的個數少于Map的個數),假設每一個不同的單詞剛好對應一個不同的分區。那么Reduce拿到的數據就是上圖所示的樣子。Reduce整合多個Map的計算結果,并且是鍵值對,鍵是單詞,值變成由每一個Map提交的計算結果組成的集合。
Reduce要做的就是把這些集合里面的值加起來,得到最后的結果,也就是在整個文檔里面,每個單詞出現了多少次。
MapReduce處理數據的三個細節
接下來我們要討論的是:在客戶端將任務提交給集群處理之前,需要先對文件進行分片,那么這個分片是根據什么來分的呢?后續又是怎樣將文件處理的任務分配給Map進程的呢?
——正確答案:提交任務的PC是Hadoop集群的客戶端,客戶端在提交任務之前要先將待處理的文件進行分片(Split)。我們的文件存放在HDFS中,而HDFS中的數據是按照數據塊的形式分散存放在各個服務器里面的,不懂沒關系,上圖:
MR框架默認將一個數據塊(Block)作為一個分片,分片是一個邏輯的概念,每個Map處理一個分片。比如說,第一個Map處理第一個分片,這個分片是從文件的開始,也就是偏移量為0的位置讀取到偏移量為128M的位置;第二個Map處理第二個分片,這個分片是從偏移量128M讀到偏移量256M,每一個分片對應啟動一個Map來對其進行處理。
Map是一個計算程序,計算邏輯由做大數據應用開發的人編寫。我們是在自己的PC上編寫代碼,編好了以后就要把代碼提交到集群上去。
提交給誰呢?提交給Yarn,這是一個資源管理模塊,它會為我們的任務執行分配資源。Yarn根據我們要處理的文件分布節點啟動相對應的Map程序,因此Map進程也是分散在集群當中,這樣就達到了分布式并發執行的效果。
至此為止,問題又來了:我們劃分文件的目的是什么?
——正確答案:第一,做分布式運算,讓計算變得更加高效,眾人拾柴火焰高;第二,由于文件分散在集群當中,如果只有一個節點計算數據的話,就必須把數據集合到這個節點,這樣做網絡代價會很大。
最后,我們來把這個過程的細節問題補充完整。
第一個細節,就是文件被處理之前,也就是在啟動MapReduce之前,必須確保待處理的文件放在HDFS上面。不然的話,計算節點沒有數據,分布式計算就沒法執行。
第二個細節,Map的輸出先放入一個環形內存緩沖區,當緩沖區數據溢出時,需將緩沖區中的數據寫入到本地磁盤,寫入本地磁盤之前通常需要做如下處理:
1.分區(Partition):默認采用Hash算法進行分區。現在我記錄了hello,world等單詞,對每一個單詞求hash值,然后用這個hash值除以Reduce的個數并取余,Reduce的個數就等于分區的個數,每個Reduce對應一個分區。得到的余數就是最終要把這個單詞放到哪一個分區。Hash算法的特點就是相同的對象求出來的值是一樣的,所以相同的單詞最終被送到相同的Reduce來處理。
這個過程稍微有一點點不好理解,沒關系,一言不合就上圖!
2.排序(Sort):將Map輸出的記錄排序,例如將(’Hi’,’1’),(‘Hello’,’1’)重新排序為(‘Hello’,’1’), (’Hi’,’1’)。
3.組合(Combine):這個動作MR框架默認是可選的,數據量很大的時候建議大家去做。這就是每個Map要完成的一個統計過程,例如將(’Hi’,’1’), (’Hi’,’1’),(‘Hello’,’1’), (Hello’,’1’)進行合并操作為(’Hi’,’2’), (‘Hello’,’2’)。
4.合并(Spill):Map在處理后會產生很多的溢出文件(spill file),這時需將多個溢出文件進行合并處理,生成一個經過分區和排序的SpillFile(MOF:MapOutFile)。為減少寫入磁盤的數據量,MR支持對MOF進行壓縮后再寫入。至此,Map的任務就算是完成啦。上圖,總結一下:
第三個細節,通常在Map 任務完成MOF輸出進度到3%時啟動Reduce,Reduce會去讀取Map的輸出文件MOF里面屬于自己的分區,把這部分數據copy到自己的內存當中來。每一個Reduce會對應一個分區,然后去做后續處理,這是一個copy的過程。
當Reduce接收的數據量不大時,則直接存放在內存緩沖區中,隨著緩沖區接收到的文件增多,Reduce要對接收到的MOF文件進行一個排序和合并,生成更大的文件,這是一個sort和merge的過程。
copy和sort、merge的過程我們一般統稱為shuffle過程,這個過程會產生許多中間文件,最后一次合并的結果直接輸出到用戶自定義的Reduce函數。Reduce對合并后的文件進行處理,計算出我們需要的結果。
那么現在大家想想,為什么需要shuffle的過程呢?
——正確答案:大家考慮一下一個分區有好幾個不同單詞的情況,而且每一個Map都會輸出一部分結果到同一個Reduce上,如果沒有shffle的過程場面該有多么的混亂。
最后,完整的過程圖雙手奉上,大家要把每一個步驟看仔細。
這就是MapReduce的一個完整的流程,其實很簡單,只是有很多細節地方需要注意一下。
看完文章你是否也躍躍欲試,現在1元即可體驗華為云的MapReduce,還能參與抽獎,不容錯過。
備注:本文部分內容轉載自微信公眾號“葉子的淺淺時光”的《解讀MapReduce》。
大數據 MapReduce
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。