<p id="9bn5v"></p>

<menuitem id="9bn5v"></menuitem>

    <nobr id="9bn5v"><thead id="9bn5v"><i id="9bn5v"></i></thead></nobr>
    <menuitem id="9bn5v"></menuitem>
    <menuitem id="9bn5v"><thead id="9bn5v"><i id="9bn5v"></i></thead></menuitem>
    <nobr id="9bn5v"></nobr>
    <menuitem id="9bn5v"></menuitem>

      <nobr id="9bn5v"><delect id="9bn5v"></delect></nobr>

      解密MapReduce

      2019-09-18 16:56:10 閱讀量:


      我學習大數據有這樣一個感悟:IT的智慧體現在算法上,而算法的靈感就來源于生活。什么意思,我們一起來看看MapReduce做離線計算到底是怎么一回事兒!要理解這個過程,我們先請出一個秘密武器:撲克牌
       
      大家都玩過撲克牌吧?沒有玩過至少見過吧?現在有兩幅撲克牌無序的堆成一摞放在桌子上。四個人玩牌,玩牌之前呢,他們要看看每一種花色的牌是否完整?請問大家,用什么方式最快?
       
      ——正確答案:把牌分成4摞,每個人拿一摞,拿到牌之后每個人把自己手里的牌按照紅黑花梅的花色分堆,大家都分好之后再按照花色把四個人手中的牌整合到一起。紅桃一摞,黑桃一摞,以此類推。到此為止,我們就已經成功的將兩幅混亂的撲克牌按花色分成四摞了。然后呢,每個人去這四摞牌里面拿到一種花色,從最小排到最大,去清點自己手里的花色是否完整!
       
      其實這就是一個離線計算的過程。離線計算的過程分為兩個階段,首先是Map的階段,就是我們最開始的時候把混亂的撲克牌分成4摞,每個人去拿一摞將其一張一張的分開的過程就是Map。分開之后,我們檢查花色,并且按照花色將其分堆,這就是一個Partition的過程。
       
      Partition完成之后呢?我們每個人的手上保存了4摞分好了花色的牌,這時候就進入了我們的Reduce階段,進入Reduce階段之后做些什么呢?首先要把每個人手里分好的牌按照花色整合到一起,然后再對整合好的每一摞牌進行檢查。最后分別輸出檢查結果。我們具體拿一些數據來分析一下這個過程。
       
      \

      OK,看這里,input是我們要處理的數據,這是一個文本文檔。我們需要做什么呢?我們把它送到MapReduce模塊里邊,需要得到如右邊所示的結果。統計出來每個單詞出現的詞數。MapReduce怎么做呢?既然是集群模式,我肯定要把任務分配給不同的服務器對吧?假設我現在把文件分成3塊(文件怎么劃分呢?),文件分成幾個塊,就會在集群當中啟動幾個Map進程。每個進程拿到一塊數據,接下來它會怎么做呢?
       
      ——正確答案:Map要對拿到的數據做一個處理,然后每個Map把處理結果交給Reduce,讓Reduce去做一個統計,對吧?那么,Map先會將一行數據按空格鍵切分,變成若干個單詞,然后單詞每出現一次,計數為1,用一個鍵值對裝起來。圖片解析奉上~~~
       
      \
       
      計算好之后呢Map還要做一件事情,在數據量很多的情況下,我們一般還會讓Map做一個單詞的統計。因為如果不做單詞統計的話,它就會把這一堆,,直接交給Reduce,所有Map的統計結果都要通過網絡傳輸給特定的起Reduce進程的服務器,這樣子的話會造成不同服務器之間數據傳輸的量很大。所以Map會把每一個單詞出現了多少次統計出來,比如hello出現了1次,world出現了2次這樣子。最后每一個Map都把自己手頭的任務計算完畢了,就把結果存儲起來,接下來就輪到Reduce上場啦!

      \
       
      在Map存儲結果的過程當中,Reduce就會被啟動,Reduce啟動以后會去拿Map處理的結果,當有多個Reduce的時候,Reduce不會把全部的結果都讀取回來,而是只讀取屬于自己的分區,即分區Partition。什么叫做分區呢?分區就是對Map計算的結果做的一個分類,有多少Reduce,我就把結果分成多少類,也就是多少個分區。這是通過一個算法來完成的,這個算法是怎么回事,我們后面會做一個細節補充。
       
      我們先以4個Reduce為例(一般情況下Reduce的個數少于Map的個數),假設每一個不同的單詞剛剛好對應一個不同的分區。那么Reduce拿到的數據就是我們圖中所示的樣子。Reduce對多個Map的計算結果做了一個整合,它還是一個一個的鍵值對,鍵是我們的單詞,但是值呢變成了由每一個Map提交的計算結果組成的集合。Reduce要做的就是把這些集合里面的值加起來,得到最后的結果,也就是在整個文檔里面,每個單詞出現了多少次。

      一级毛片一级毛片,毛片毛片毛片,一级做α爱毛毛片,一级毛毛片,一级做a爱片性色毛片