天天看點

《R與Hadoop大資料分析實戰》一2.2 Hadoop MapReduce技術簡介

本節書摘來自華章出版社《r與hadoop大資料分析實戰》一書中的第2章,第2.2節,作者 (印)vignesh prajapati,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視

一般而言,mapreduce模型可以使用多種語言實作,除此之外,hadoop mapreduce也是一個用于友善編寫應用程式的流行java語言架構。通過把大資料在大機群(一般有數千台計算機)上并行運算,實作整個系統的高可靠性和高容錯性。mapreduce分為map和reduce兩階段,并主要處理鍵值對類型的資料。map和reduce任務運作于叢集中,map階段的輸出作為reduce階段的輸入。

所有資料的輸入元素在mapreduce處理時均不能被更新,一旦map任務的輸入資料(鍵值對資料)發生變化,也不會影響輸入檔案。map執行單元的輸出将會以鍵為基礎配置設定到适當的reduce執行單元中,并作為其輸入。這種資料的次序處理方式在hadoop mapreduce算法以及hadoop叢集的幫助下将會對并行運算發揮極大的益處。

mapreduce程式會将以清單形式輸入的資料集同樣轉化為清單形式輸出。這種清單的轉化過程幾乎在map和reduce階段中要重複兩次。我們也可以在這些重複過程中配置map和reduce執行單元的個數。在下一節中,我們将介紹基于舊版本api内mapreduce的基本概念。

hadoop用于分析大資料時使用的概念如下:

client:用于作業的初始化

jobtracker:用于作業的狀态監控

tasktracker:用于作業的實際執行

hdfs:用于存儲輸入和輸出資料

hadoop mapreduce處理資料的四個主要過程如下:

資料導入hdfs中

map階段的執行

重組(shuffing)并排序(sorting)

reduce階段的執行

将輸入資料集上傳到hadoop的目錄中,才能被mapreduce所使用。hadoop分布式檔案系統(hadoop distributed file system,hdfs)将會把輸入資料分割為多個分支并存儲于叢集的多個資料節點中,并通過重複複制實作容錯機制。所有的這些資料分支将會通過map任務和reduce任務的tasktracker程序以并行方式來處理。

這裡還有另外一些hadoop元件用于從hdfs中擷取資料集:

sqoop:這是一個開源的設計工具,主要用于在apache hadoop和結構化關系型資料庫之間傳輸大量資料。假如你的應用中已經配置了mysql資料庫,同時還想使用該資料進行資料分析,那麼推薦使用sqoop工具把資料庫内的資料導入hdfs檔案系統中。同時當完成資料分析後,sqoop工具也用于把分析結果資料導出mysql資料庫。

flume:它是一種用于向hdfs檔案系統中提供高效收集、聚合、移動大量日志資料的服務,其性能可靠,并以分布式方式運作。flume可以讀取幾乎所有的源資料,例如日志檔案、系統日志、其他unix系統程序的标準化輸出。

使用上面這些資料收集和移動的架構,可以使mapreduce在處理大資料分析時的資料遷移過程變得非常簡單。

執行client應用程式以啟動hadoop mapreduce程序。然後在map階段複制作業資源并存儲于hdfs中,之後調用jobtracker以執行作業。jobtracker首先初始化作業,然後檢索輸入資料并分割資訊,最後為每個作業建立一個map任務。

jobtracker将會調用tasktracker以運作map任務,其輸入是已配置設定好的資料集。map任務以鍵值對形式讀取分割後的資料作為輸入。鍵值對提供了後續産生鍵值對格式中間資料的映射方法。對于每個鍵值對資料,至少對應一個輸出。

《R與Hadoop大資料分析實戰》一2.2 Hadoop MapReduce技術簡介

之後會産生多個鍵值對資料,以至于鍵會被重複很多次。是以可這些鍵将會被再次應用于reduce執行單元中。隻要格式正确,map階段的輸出數值和reduce階段的輸入數值也一定會是一緻的。

當完成map階段的操作後,tasktracker會把結果放于它的緩沖存儲區或本地磁盤中(如果輸出資料的大小超過某一門檻值時)。

例如,假設我們有個用于把輸入文本資料轉化為小寫格式的map函數,它将會把一系列的輸入字元串轉化為小寫字元串。

鍵與值:在mapreduce中,根據不同的鍵,每個值都有它的定義。map處理單元接收這些鍵值對資料,并且與輸入資料的資料類型相關,其資料類型在作業配置檔案中進行說明。

重組并排序

為了優化mapreduce程式,map階段與reduce階段的中間銜接階段很重要。

隻要map輸出了有效的資料,那麼中間階段的處理程式就将會被自動調用。當完成了map階段處理過程,所有産生的鍵值對中間資料将會被partitioner函數分割。partitioner函數的輸出将會依據鍵程序排序。排序操作的輸出資料将會存儲于該節點計算機的緩沖區和tasktracker内。

combiner函數通常就是reduce執行單元自身。是以資料壓縮不是通過gzip或者與之相似的壓縮形式,而是通過映射輸出資料節點上的reduce執行單元進行壓縮。資料通過combiner函數回歸然後重組,再傳輸到reduce節點上。為了加快資料從map執行單元輸出到tasktracker上reduce執行單元之間的資料傳輸,需要用combiner函數壓縮輸出結果。預設情況下,map執行單元輸出結果将會被存入緩沖存儲器,如果輸出大小大于臨界值,輸出結果會被存儲在本地磁盤上。輸出資料将可以通過超文本傳輸協定擷取(http)。

一旦map執行單元輸出了有效資料,reduce節點計算機的tasktracker将會接收到被分割的map階段的輸出資料,然後資料将會被重新組成為一個大的資料檔案,并再排序後提供給reducer方法進行處理。

reducer方法接收到一系列輸入資料,格式為(key,list(value)),并基于一般邏輯進行聚集(aggregates),最後産生(key,value)格式的輸出。

《R與Hadoop大資料分析實戰》一2.2 Hadoop MapReduce技術簡介

reducer方法輸出後的結果以指定的格式直接寫入hdfs系統中,指定格式的方式是在mapreduce job的配置中進行設定。

hadoop mapreduce的局限性:

mapreduce架構難以利用在諸如實時流、圖形處理以及資訊傳遞這樣的複雜邏輯中。

相比于有索引的資料庫,在分散的、無索引的資料中進行資料查詢是無效的。然而,如果資料的索引是後來産生的,在移動或是增加資料時,需要維持該索引。

不能同時運作reduce任務和map任務來減少整體的處理時間,因為隻有擷取map任務的結果後,reduce任務才能開始。(reduce執行單元的輸入完全依賴于map執行單元的輸出)并且,我們不能控制map和reduce任務執行的順序。但是有時候,基于應用邏輯,在map任務結束需要進行資料收集的情況下,我們可以理所當然地為reduce任務配置延遲啟動。

如果reduce任務花費太多時間但是最後以失敗告終,或者沒有其他reduce任務槽可供重新安排reduce任務,糟糕的資源利用情況會使長期運作的reduce任務無法完成(這可以通過yarn來解決)。

既然本書要對資料分析給出解決方案,那就應該提供一些分析資料的相關執行個體。例如,如果某讀者對以前他人提及的内容有相似的問題,hadoop将發揮作用。hadoop不是一個對所有大資料問題的通用解決方案。它隻是把欲處理的大資料分割成小塊,并通過分布式的服務實作并行處理而已。這使得在處理超大資料時,可以節省更多的時間并把成本降低。

如果可以把問題設計為map和reduce兩個階段處理的方式,那麼就可以使用mapreduce技術進行解決。一般而言,hadoop技術在處理資料時不會局限于機器的記憶體大小(r語言在運作資料處理程序時,則會經常出現如下錯誤提示:cannot allocate vector of size 2.5 gb)

一些經典的java概念使得hadoop更加容易了解。如下:

遠端過程調用:這是一項程序間通信,它允許計算機程式發起一個運作在另一個位址空間(通常是在共享網絡的另一台計算機上)的子程式或過程,而不需要程式員編寫遠端互動的細節代碼。也就是說,本質上無論子程式運作在本地程式還是遠端程式,程式員都編寫相同的代碼。

序列化/反序列化:序列化指一台java虛拟機(jvm)可以向一些流中輸出對象的狀态,這樣我們能夠基本上讀出所有的成員并将其狀态傳輸或存儲到流、磁盤等。預設機制是二進制格式,是以它比文本格式更緊湊。通過序列化,機器能夠通過網絡傳輸資料。反序列化亦然,它被用于通過網絡接收資料對象。

java泛型:當提供編譯期類型安全性時,它允許用一種類型或是方法來操縱各種不同類型的對象,讓java成為一種完全靜态類型的語言。

java集合:這個架構是一組類和接口,用于使用簡單的java對象收集各種不同類型的資料。

java并發:它支援并行程式設計,并且所有程式執行由線程内容完成。它主要用于在單一作業系統程序中作為一組線程執行計算過程。

簡單的java對象(pojo):實際就是普通的javabeans。pojo暫時用于設定以及檢索資料對象的值。