天天看點

《Hadoop大資料分析與挖掘實戰》——2.3節Hadoop原理

本節書摘來自華章社群《hadoop大資料分析與挖掘實戰》一書中的第2章,第2.3節hadoop原理,作者張良均 樊哲 趙雲龍 李成華 ,更多章節内容可以通路雲栖社群“華章社群”公衆号檢視

2.3 hadoop原理

2.3.1 hadoop hdfs原理

hadoop分布式檔案系統(hdfs)被設計成适合運作在通用硬體(commodity hardware)上的分布式檔案系統。它和現有的分布式檔案系統有很多共同點,同時,它和其他的分布式檔案系統的差別也是很明顯的。hdfs是一個高度容錯性的系統,适合部署在廉價的機器上。hdfs能提供高吞吐量的資料通路,非常适合大規模資料集上的應用。hdfs放寬了一部分posix限制,來實作流式讀取檔案系統資料的目的。hdfs最開始是作為apache nutch搜尋引擎項目的基礎架構而開發的,hdfs是apache hadoop core項目的一部分。

hdfs有着高容錯性(fault-tolerant)的特點,并且設計用來部署在低廉的(low-cost)硬體上。而且它提供高吞吐量(high throughput)來通路應用程式的資料,适合那些有着超大資料集(large data set)的應用程式。hdfs放寬了(relax)posix的要求(requirements)這樣可以實作以流的形式通路(streaming access)檔案系統中的資料。

hdfs采用master/slave架構。一個hdfs叢集是由一個namenode和一定數目的datanodes組成。namenode是一個中心伺服器,負責管理檔案系統的名字空間(namespace)以及用戶端對檔案的通路。叢集中的datanode一般是一個節點一個,負責管理它所在節點上的存儲。hdfs暴露了檔案系統的名字空間,使用者能夠以檔案的形式在上面存儲資料。從内部看,一個檔案其實被分成一個或多個資料塊,這些塊存儲在一組datanode上。namenode執行檔案系統的名字空間操作,例如打開、關閉、重命名檔案或目錄。它也負責确定資料塊到具體datanode節點的映射。datanode負責處理檔案系統用戶端的讀寫請求。在namenode的統一排程下進行資料塊的建立、删除和複制。圖2-5所示為hdfs的架構圖。

《Hadoop大資料分析與挖掘實戰》——2.3節Hadoop原理

hdfs架構圖hdfs資料上傳原理可以參考圖2-5對照了解,資料上傳過程如下所示:

1)client端發送一個添加檔案到hdfs的請求給namenode;

2)namenode告訴client端如何來分發資料塊以及分發的位置;

3)client端把資料分為塊(block),然後把這些塊分發到datanode中;

4)datanode在namenode的指導下複制這些塊,保持備援。

2.3.2 hadoop mapreduce原理

hadoop mapreduce是一個快速、高效、簡單用于編寫并行處理大資料程式并應用在大叢集上的程式設計架構。其前身是google公司的mapreduce。mapreduce是google公司的核心計算模型,它将複雜的、運作于大規模叢集上的并行計算過程高度地抽象到了兩個函數:map和reduce。适合用mapreduce來處理的資料集(或任務),需要滿足一個基本要求:待處理的資料集可以分解成許多小的資料集,而且每一個小資料集都可以完全并行地進行處理。概念“map”(映射)和“reduce”(歸約),以及它們的主要思想,都是從函數式程式設計語言裡借來的,同時包含了從矢量程式設計語言裡借來的特性。hadoop mapreduce極大地友善了程式設計人員在不會分布式并行程式設計的情況下,将自己的程式運作在分布式系統上。

一個mapreduce作業(job)通常會把輸入的資料集切分為若幹獨立的資料塊,由map任務(task)以完全并行的方式處理它們。架構會對map的輸出先進行排序,然後把結果輸入給reduce任務。通常,作業的輸入和輸出都會被存儲在檔案系統中。整個架構負責任務的排程和監控,以及重新執行已經失敗的任務。

通常,mapreduce架構的計算節點和存儲節點是運作在一組相同的節點上的,也就是說,運作mapreduce架構和運作hdfs檔案系統的節點通常是在一起的。這種配置允許架構在那些已經存好資料的節點上高效地排程任務,這可以使整個叢集的網絡帶寬被非常高效地利用。

mapreduce架構包括一個主節點(resourcemanager)、多個子節點(運作nodemanager)和mrappmaster(每個任務一個)共同組成。應用程式至少應該指明輸入/輸出的位置(路徑),并通過實作合适的接口或抽象類提供map和reduce函數,再加上其他作業的參數,就構成了作業配置(job configuration)。hadoop的job client送出作業(jar包/可執行程式等)和配置資訊給resourcemanager,後者負責分發這些軟體和配置資訊給slave、排程任務且監控它們的執行,同時提供狀态和診斷資訊給job-client。

雖然hadoop架構是用java實作的,但mapreduce應用程式則不一定要用java來寫,也可以使用ruby、python、c++等來編寫。

mapreduce架構的流程如圖2-6所示。

針對上面的流程可以分為兩個階段來描述。

(1)map階段

1)inputformat根據輸入檔案産生鍵值對,并傳送到mapper類的map函數中;

2)map輸出鍵值對到一個沒有排序的緩沖記憶體中;

3)當緩沖記憶體達到給定值或者map任務完成,在緩沖記憶體中的鍵值對就會被排序,然後輸出到磁盤中的溢出檔案;

4)如果有多個溢出檔案,那麼就會整合這些檔案到一個檔案中,且是排序的;

5)這些排序過的、在溢出檔案中的鍵值對會等待reducer的擷取。

《Hadoop大資料分析與挖掘實戰》——2.3節Hadoop原理

(2)reduce階段

1)reducer擷取mapper的記錄,然後産生另外的鍵值對,最後輸出到hdfs中;

2)shuffle:相同的key被傳送到同一個的reducer中;

3)當有一個mapper完成後,reducer就開始擷取相關資料,所有的溢出檔案會被排序到一個記憶體緩沖區中;

4)當記憶體緩沖區滿了後,就會産生溢出檔案到本地磁盤;

5)當reducer所有相關的資料都傳輸完成後,所有溢出檔案就會被整合和排序;

6)reducer中的reduce方法針對每個key調用一次;

7)reducer的輸出到hdfs。

2.3.3 hadoop yarn原理

經典mapreduce的最嚴重的限制主要關系到可伸縮性、資源利用和對與mapreduce不同的工作負載的支援。在mapreduce架構中,作業執行受兩種類型的程序控制:一個稱為jobtracker的主要程序,它協調在叢集上運作的所有作業,配置設定要在tasktracker上運作的map和reduce任務。另一個就是許多稱為tasktracker的下級程序,它們運作配置設定的任務并定期向jobtracker報告進度。

這時,經過工程師們的努力,誕生了一種全新的hadoop架構——yarn(也稱為mrv2)。yarn稱為下一代hadoop計算平台,主要包括resourcemanager、applicationmaster、nodemanager,其中resourcemanager用來代替叢集管理器,applicationmaster代替一個專用且短暫的jobtracker,nodemanager代替tasktracker。

mrv2最核心的思想就是将jobtracker兩個主要的功能分離成單獨的元件,這兩個功能是資源管理和任務排程/監控。新的資料總管全局管理所有應用程式計算資源的配置設定,每一個應用的applicationmaster負責相應的排程和協調。一個應用程式要麼是一個單獨的傳統的mapreduce任務或者是一個dag(有向無環圖)任務。resourcemanager和每一台機器的節點管理服務(nodemanger)能夠管理使用者在那台機器上的程序并能對計算進行組織。事實上,每一個應用的applicationmaster是一個特定的架構庫,它和resourcemanager來協調資源,和nodemanager協同工作以運作和監控任務。

resourcemanager有兩個重要的元件:scheduler和applicationsmanager。scheduler負責配置設定資源給每個正在運作的應用,同時需要注意scheduler是一個單一的配置設定資源的元件,不負責監控或者跟蹤任務狀态的任務,而且它不保證重新開機失敗的任務。applicationsmanager注意負責接受任務的送出和執行應用的第一個容器applicationmaster協調,同時提供當任務失敗時重新開機的服務。如圖2-7所示,用戶端送出任務到resourcemanager的applicationsmanager,然後scheduler在獲得了叢集各個節點的資源後,為每個應用啟動一個app mastr(applicationmaster),用于執行任務。每個app mastr啟動一個或多個container用于實際執行任務。

《Hadoop大資料分析與挖掘實戰》——2.3節Hadoop原理

繼續閱讀