分布式计算引擎MapReduce
應用場景
當數據量大到一定程度,傳統的技術無法進行解決的時候,那么需要采用分布式計算引擎MapReduce來嘗試解決了!
操作步驟
1. 架構圖
Hadoop是由Apache基金會所開發的分布式系統基礎架構,組織架構如下圖所示:
正如上圖所示:Hadoop包含很多優秀的子項目,例如HDFS,Mapreduce,Hbase,Hive,Zookeeper等,其中最重要的,也是Hadoop當時風靡一時的原因是HDFS(分布式文件系統)和Mapreduce(分布式計算框架)。HDFS解釋了,hadoop如何解決大數據的存儲問題,而Mapreduce解釋了,hadoop如何對大數據的計算問題。
2. MapReduce
把大量的數據放到了HDFS上,接下去如何對大數據進行分析,需要Hadoop的另一個核心技術,MapReduce。
Mapreduce是一種編程模型,是一種編程方法,抽象理論。MapReduce相當的抽象,還是用通俗的話來說比較好。比如,現在要做一份洋蔥辣椒醬,當然取一個洋蔥,把它切碎,然后拌入鹽和水,最后放進混合研磨機里研磨。這樣就能得到洋蔥辣椒醬了。那現在要用薄荷、洋蔥、番茄、辣椒、大蒜弄一瓶混合辣椒醬,我們會取薄荷葉一撮,洋蔥一個,番茄一個,辣椒一根,大蒜一根,切碎后加入適量的鹽和水,再放入混合研磨機里研磨,這樣就可以得到一瓶混合辣椒醬了。
這其實和MapReduce是一個道理,Map和Reduce其實是兩種操作,Map(映射): 把洋蔥、番茄、辣椒和大蒜切碎,是各自作用在這些物體上的一個Map操作。所以你給Map一個洋蔥,Map就會把洋蔥切碎。
同樣的,你把辣椒,大蒜和番茄一一地拿給Map,你也會得到各種碎塊。 所以,當你在切像洋蔥這樣的蔬菜時,你執行就是一個Map操作。
Map操作適用于每一種蔬菜,它會相應地生產出一種或多種碎塊,在我們的例子中生產的是蔬菜塊。在Map操作中可能會出現有個洋蔥壞掉了的情況,你只要把壞洋蔥丟了就行了。所以,如果出現壞洋蔥了,Map操作就會過濾掉壞洋蔥而不會生產出任何的壞洋蔥塊。Reduce(化簡):在這一階段,你將各種蔬菜碎都放入研磨機里進行研磨,你就可以得到一瓶辣椒醬了。這意味要制成一瓶辣椒醬,你得研磨所有的原料。因此,研磨機通常將map操作的蔬菜碎聚集在了一起。
mapreduce操作過程如下圖所示:
一切都是從最上方的user program開始的,user program鏈接了MapReduce庫,實現了最基本的Map函數和Reduce函數。圖中執行的順序都用數字標記了。
1.MapReduce庫先把user program的輸入文件劃分為M份(M為用戶定義),每一份通常有16MB到64MB,如圖左方所示分成了split0~4;然后使用fork將用戶進程拷貝到集群內其它機器上。
2.user program的副本中有一個稱為master,其余稱為worker,master是負責調度的,為空閑worker分配作業(Map作業或者Reduce作業),worker的數量也是可以由用戶指定的。
3.被分配了Map作業的worker,開始讀取對應分片的輸入數據,Map作業數量是由M決定的,和split一一對應;Map作業從輸入數據中抽取出鍵值對,每一個鍵值對都作為參數傳遞給map函數,map函數產生的中間鍵值對被緩存在內存中。
4.緩存的中間鍵值對會被定期寫入本地磁盤,而且被分為R個區,R的大小是由用戶定義的,將來每個區會對應一個Reduce作業;這些中間鍵值對的位置會被通報給master,master負責將信息轉發給Reduce worker。
5.master通知分配了Reduce作業的worker它負責的分區在什么位置(肯定不止一個地方,每個Map作業產生的中間鍵值對都可能映射到所有R個不同分區),當Reduce worker把所有它負責的中間鍵值對都讀過來后,先對它們進行排序,使得相同鍵的鍵值對聚集在一起。因為不同的鍵可能會映射到同一個分區也就是同一個Reduce作業(誰讓分區少呢),所以排序是必須的。
6.reduce worker遍歷排序后的中間鍵值對,對于每個唯一的鍵,都將鍵與關聯的值傳遞給reduce函數,reduce函數產生的輸出會添加到這個分區的輸出文件中。
7.當所有的Map和Reduce作業都完成了,master喚醒正版的user program,MapReduce函數調用返回user program的代碼。
有人問:金庸的天龍八部小說里誰出現的次數最多?很多人說是喬峰,是錯誤的,其實這是一個用mapreduce的很好的例子,先把小說揉碎,揉成一個一個的詞組,將人名詞組定義為map中的key,value即為出現的次數,然后通過reduce進行歸一,統計出現次數最多的人物,統計結果是段譽。結果前十位分別如下:
總結
以上是生活随笔為你收集整理的分布式计算引擎MapReduce的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript中赋值运算符的使用
- 下一篇: 拉幅广告代码