MapReduce入門

 MapReduce介紹
本節將介紹Hadoop的分佈式計算框架:MapReduce。
 MapReduce來歷

MapReduce最先來源於谷歌公司的一篇學術論文,是由Google公司研究提出的一種面向大規模數據處理的並行計算模型和方法,當時主要是爲了解決其搜索引擎中大規模網頁數據的並行化處理。但因爲MapReduce能夠廣泛應用於不少大規模數據的計算問題,所以自發明MapReduce之後,Google公司內部進一步將其普遍應用於不少大規模數據處理問題。到目前爲止,Google公司內有上萬個各類不一樣的算法問題和程序都使用MapReduce進行處理。

MapReduce是一種編程模型,用於大規模數據集(大於1TB)的並行運算。概念」Map(映射)」和」Reduce(歸約)」,是它們的主要思想,都是從函數式編程語言裏借來的,還有從矢量編程語言裏借來的特性。它極大地方便了編程人員在不會分佈式並行編程的狀況下,將本身的程序運行在分佈式系統上。 當前的軟件實現是指定一個Map(映射)函數,用來把一組鍵值對映射成一組新的鍵值對,指定併發的Reduce(歸約)函數,用來保證全部映射的鍵值對中的每個共享相同的鍵組。

MapReduce是面向大數據並行處理的計算模型、框架和平臺,它隱含了如下三層含義:

    MapReduce是一個基於集羣的高性能並行計算平臺(Cluster Infrastructure)。它容許用市場上普通的商用服務器構成一個包含數10、數百至數千個節點的分佈和並行計算集羣。
    MapReduce是一個並行計算與運行軟件框架(Software Framework)。它提供了一個龐大但設計精良的並行計算軟件框架,能自動完成計算任務的並行化處理,自動劃分計算數據和計算任務,在集羣節點上自動分配和執行任務以及收集計算結果,將數據分佈存儲、數據通訊、容錯處理等並行計算涉及到的不少系統底層的複雜細節交由系統負責處理,大大減小了軟件開發人員的負擔。
    MapReduce是一個並行程序設計模型與方法(Programming Model & Methodology)。它藉助於函數式程序設計語言Lisp的設計思想,提供了一種簡便的並行程序設計方法,用Map和Reduce兩個函數編程實現基本的並行計算任務,提供了抽象的操做和並行編程接口,以簡單方便地完成大規模數據的編程和計算處理 。

Hadoop MapReduce是一個用於輕鬆編寫應用程序的軟件框架,該應用程序以可靠,容錯的方式在大型集羣(數千個節點)上並行處理大量數據(多TB數據集)。

MapReduce 做業一般將輸入數據集分紅獨立的塊,這些塊由地圖任務以徹底並行的方式處理。該框架對映射的輸出進行排序,而後將其輸入到reduce任務。一般,做業的輸入和輸出都存儲在文件系統中。該框架負責調度任務,監視它們並從新執行失敗的任務。

一般,計算節點和存儲節點是相同的,即MapReduce框架和Hadoop分佈式文件系統(請參閱HDFS架構指南)在同一組節點上運行。此配置容許框架有效地調度數據已存在的節點上的任務,致使集羣中的很是高的聚合帶寬。

MapReduce框架由一個單一主的ResourceManager的,一個從節點管理器每一個集羣節點,MRAppMaster每一個應用程序(見YARN架構指南)。

最小的應用程序經過適當的接口和/或抽象類的實現來指定輸入/輸出位置和供應圖並減小功能。這些和其餘做業參數包括做業配置。

而後,Hadoop 做業客戶端將做業(jar /可執行文件等)和配置提交到ResourceManager,而後ResourceManager承擔將軟件/配置分發到從站,調度任務和監視它們,向做業提供狀態和診斷信息,客戶。
MapReduce運行機制

從邏輯實體的角度講解mapreduce運行機制,這些按照時間順序包括:輸入分片(input split)、map階段、combiner階段、shuffle階段和reduce階段。
程序員

 

 輸入分片(input split):在進行map計算以前,mapreduce會根據輸入文件計算輸入分片(input split),每一個輸入分片(input split)針對一個map任務,輸入分片(input split)存儲的並不是數據自己,而是一個分片長度和一個記錄數據的位置的數組,輸入分片(input split)每每和hdfs的block(塊)關係很密切,假如咱們設定hdfs的塊的大小是64mb,若是咱們輸入有三個文件,大小分別是3mb、65mb和127mb,那麼mapreduce會把3mb文件分爲一個輸入分片(input split),65mb則是兩個輸入分片(input split)而127mb也是兩個輸入分片(input split),換句話說咱們若是在map計算前作輸入分片調整,例如合併小文件,那麼就會有5個map任務將執行,並且每一個map執行的數據大小不均,這個也是mapreduce優化計算的一個關鍵點。

map階段:就是程序員編寫好的map函數了,所以map函數效率相對好控制,並且通常map操做都是本地化操做也就是在數據存儲節點上進行;

combiner階段:combiner階段是程序員能夠選擇的,combiner其實也是一種reduce操做,所以咱們看見WordCount類裏是用reduce進行加載的。Combiner是一個本地化的reduce操做,它是map運算的後續操做,主要是在map計算出中間文件前作一個簡單的合併重複key值的操做,例如咱們對文件裏的單詞頻率作統計,map計算時候若是碰到一個hadoop的單詞就會記錄爲1,可是這篇文章裏hadoop可能會出現n屢次,那麼map輸出文件冗餘就會不少,所以在reduce計算前對相同的key作一個合併操做,那麼文件會變小,這樣就提升了寬帶的傳輸效率,畢竟hadoop計算力寬帶資源每每是計算的瓶頸也是最爲寶貴的資源,可是combiner操做是有風險的,使用它的原則是combiner的輸入不會影響到reduce計算的最終輸入,例如:若是計算只是求總數,最大值,最小值可使用combiner,可是作平均值計算使用combiner的話,最終的reduce計算結果就會出錯。

shuffle階段:將map的輸出做爲reduce的輸入的過程就是shuffle了,這個是mapreduce優化的重點地方。這裏我不講怎麼優化shuffle階段,講講shuffle階段的原理,由於大部分的書籍裏都沒講清楚shuffle階段。Shuffle一開始就是map階段作輸出操做,通常mapreduce計算的都是海量數據,map輸出時候不可能把全部文件都放到內存操做,所以map寫入磁盤的過程十分的複雜,更況且map輸出時候要對結果進行排序,內存開銷是很大的,map在作輸出時候會在內存裏開啓一個環形內存緩衝區,這個緩衝區專門用來輸出的,默認大小是100mb,而且在配置文件裏爲這個緩衝區設定了一個閥值,默認是0.80(這個大小和閥值都是能夠在配置文件裏進行配置的),同時map還會爲輸出操做啓動一個守護線程,若是緩衝區的內存達到了閥值的80%時候,這個守護線程就會把內容寫到磁盤上,這個過程叫spill,另外的20%內存能夠繼續寫入要寫進磁盤的數據,寫入磁盤和寫入內存操做是互不干擾的,若是緩存區被撐滿了,那麼map就會阻塞寫入內存的操做,讓寫入磁盤操做完成後再繼續執行寫入內存操做,前面我講到寫入磁盤前會有個排序操做,這個是在寫入磁盤操做時候進行,不是在寫入內存時候進行的,若是咱們定義了combiner函數,那麼排序前還會執行combiner操做。每次spill操做也就是寫入磁盤操做時候就會寫一個溢出文件,也就是說在作map輸出有幾回spill就會產生多少個溢出文件,等map輸出所有作完後,map會合並這些輸出文件。這個過程裏還會有一個Partitioner操做,對於這個操做不少人都很迷糊,其實Partitioner操做和map階段的輸入分片(Input split)很像,一個Partitioner對應一個reduce做業,若是咱們mapreduce操做只有一個reduce操做,那麼Partitioner就只有一個,若是咱們有多個reduce操做,那麼Partitioner對應的就會有多個,Partitioner所以就是reduce的輸入分片,這個程序員能夠編程控制,主要是根據實際key和value的值,根據實際業務類型或者爲了更好的reduce負載均衡要求進行,這是提升reduce效率的一個關鍵所在。到了reduce階段就是合併map輸出文件了,Partitioner會找到對應的map輸出文件,而後進行復制操做,複製操做時reduce會開啓幾個複製線程,這些線程默認個數是5個,程序員也能夠在配置文件更改複製線程的個數,這個複製過程和map寫入磁盤過程相似,也有閥值和內存大小,閥值同樣能夠在配置文件裏配置,而內存大小是直接使用reduce的tasktracker的內存大小,複製時候reduce還會進行排序操做和合並文件操做,這些操做完了就會進行reduce計算了。

reduce階段:和map函數同樣也是程序員編寫的,最終結果是存儲在hdfs上的。

算法

相關文章
相關標籤/搜索