撲克牌學大數據:小白也能讀懂的MapReduce工作原理

      網友投稿 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做單詞的統計。

      因為如果不做單詞統計的話,它就會把這一堆直接交給Reduce,所有Map的統計結果都要通過網絡傳輸給特定的Reduce進程的服務器,這樣會造成不同服務器之間數據傳輸量很大。

      所以Map會把每一個單詞出現了多少次統計出來,比如hello出現了1次,world出現了2次。最后每個Map將手頭的任務計算完畢就把結果存儲起來,接下來就輪到Reduce上場。

      在Map存儲結果的過程中,Reduce會被啟動,同時去拿Map處理的結果,當有多個Reduce的時候,Reduce不會把全部的結果都讀取回來,而是只讀取屬于自己的分區,即分區Partition。

      什么叫做分區呢?

      玩撲克牌學大數據:小白也能讀懂的MapReduce工作原理

      分區就是對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小時內刪除侵權內容。

      上一篇:創建方式hi
      下一篇:帶特效的數據查詢,再也不怕看花了眼
      相關文章
      亚洲免费综合色在线视频| 亚洲综合小说久久另类区| 国产精品亚洲综合久久| 亚洲欧洲日产v特级毛片| 亚洲精品美女视频| 亚洲欧洲自拍拍偷综合| 亚洲视频一区在线观看| 亚洲网站免费观看| 亚洲最大免费视频网| 亚洲人成网站在线观看播放动漫| 亚洲精品福利网站| 亚洲国产av一区二区三区丶| 亚洲免费视频观看| 国产成人亚洲综合网站不卡| 亚洲色大网站WWW永久网站| 亚洲欧美成人av在线观看| 亚洲av成人一区二区三区观看在线 | 久久久久亚洲精品无码网址| 亚洲一区二区三区乱码A| 国产偷v国产偷v亚洲高清| 亚洲精品亚洲人成人网| 亚洲av日韩av不卡在线观看 | 亚洲精品无码AV人在线播放| 亚洲理论电影在线观看| 久久久久久亚洲精品中文字幕| 亚洲avav天堂av在线不卡 | 国产精品亚洲一区二区三区久久 | 久久精品国产亚洲av麻豆蜜芽| 男人天堂2018亚洲男人天堂| 亚洲av无码一区二区三区四区| 久久久久久久久无码精品亚洲日韩| 国产亚洲精品免费| 中文字幕亚洲不卡在线亚瑟| 亚洲精品色午夜无码专区日韩| 亚洲视频一区调教| 久久亚洲AV午夜福利精品一区 | 久久久亚洲欧洲日产国码是AV| 亚洲一本之道高清乱码| 亚洲色欲色欲www在线播放 | 亚洲色图校园春色| 亚洲日韩精品无码专区加勒比|