1. 程式人生 > >Hadoop分散式系統架構詳解

Hadoop分散式系統架構詳解

導語:hadoop 簡單來說就是用 java寫的分散式 ,處理大資料的框架,主要思想是 “分組合並” 思想。
        分組:比如 有一個大型資料,那麼他就會將這個資料按照演算法分成多份,每份儲存在 從屬主機上,並且在從屬主機上進行計算,主節點主要負責Hadoop兩個關鍵功能模組HDFS、Map Reduce的監督
        合併:將每個機器上的計算結果合併起來 再在一臺機器上計算,得到最終結果。這就是mapreduce 演算法。

        Hadoop主要的任務部署分為3個部分,分別是:Client機器,主節點和從節點。主節點主要負責Hadoop兩個關鍵功能模組HDFS、Map Reduce的監督。當Job Tracker使用Map Reduce進行監控和排程資料的並行處理時,名稱節點則負責HDFS監視和排程。從節點負責了機器執行的絕大部分,擔當所有資料儲存和指令計算的苦差。每個從節點既扮演者資料節點的角色又衝當與他們主節點通訊的守護程序。守護程序隸屬於Job Tracker,資料節點在歸屬於名稱節點。

1、Hadoop的整體框架 

Hadoop由HDFS、MapReduce、HBase、Hive和ZooKeeper等成員組成,其中最基礎最重要元素為底層用於儲存叢集中所有儲存節點檔案的檔案系統HDFS(Hadoop Distributed File System)來執行MapReduce程式的MapReduce引擎。

這裡寫圖片描述

(1)Pig是一個基於Hadoop的大規模資料分析平臺,Pig為複雜的海量資料平行計算提供了一個簡單的操作和程式設計介面; 
(2)Hive是基於Hadoop的一個工具,提供完整的SQL查詢,可以將sql語句轉換為MapReduce任務進行執行; 
(3)ZooKeeper:高效的,可拓展的協調系統,儲存和協調關鍵共享狀態; 
(4)HBase是一個開源的,基於列儲存模型的分散式資料庫; 
(5)HDFS是一個分散式檔案系統,有著高容錯性的特點,適合那些超大資料集的應用程式; 
(6)MapReduce是一種程式設計模型,用於大規模資料集(大於1TB)的並行運算。 
下圖是一個典型的Hadoop叢集的部署結構: 
這裡寫圖片描述

接著給出Hadoop各元件依賴共存關係: 
這裡寫圖片描述

2、Hadoop的核心設計 
這裡寫圖片描述

(1)HDFS 
HDFS是一個高度容錯性的分散式檔案系統,可以被廣泛的部署於廉價的PC上。它以流式訪問模式訪問應用程式的資料,這大大提高了整個系統的資料吞吐量,因而非常適合用於具有超大資料集的應用程式中。 
HDFS的架構如圖所示。HDFS架構採用主從架構(master/slave)。一個典型的HDFS叢集包含一個NameNode節點和多個DataNode節點。NameNode節點負責整個HDFS檔案系統中的檔案的元資料的保管和管理,叢集中通常只有一臺機器上執行NameNode例項,DataNode節點儲存檔案中的資料,叢集中的機器分別執行一個DataNode例項。在HDFS中,NameNode節點被稱為名稱節點,DataNode節點被稱為資料節點。DataNode節點通過心跳機制與NameNode節點進行定時的通訊。 
這裡寫圖片描述

 
•NameNode 
可以看作是分散式檔案系統中的管理者,儲存檔案系統的meta-data,主要負責管理檔案系統的名稱空間,叢集配置資訊,儲存塊的複製。

•DataNode 
是檔案儲存的基本單元。它儲存檔案塊在本地檔案系統中,儲存了檔案塊的meta-data,同時週期性的傳送所有存在的檔案塊的報告給NameNode。

•Client 
就是需要獲取分散式檔案系統檔案的應用程式。

以下來說明HDFS如何進行檔案的讀寫操作: 
這裡寫圖片描述

檔案寫入: 
1. Client向NameNode發起檔案寫入的請求 
2. NameNode根據檔案大小和檔案塊配置情況,返回給Client它所管理部分DataNode的資訊。 
3. Client將檔案劃分為多個檔案塊,根據DataNode的地址資訊,按順序寫入到每一個DataNode塊中。

這裡寫圖片描述

檔案讀取: 
1. Client向NameNode發起檔案讀取的請求 
2. NameNode返回檔案儲存的DataNode的資訊。 
3. Client讀取檔案資訊。

(2)MapReduce

MapReduce是一種程式設計模型,用於大規模資料集的並行運算。Map(對映)和Reduce(化簡),採用分而治之思想,先把任務分發到叢集多個節點上,平行計算,然後再把計算結果合併,從而得到最終計算結果。多節點計算,所涉及的任務排程、負載均衡、容錯處理等,都由MapReduce框架完成,不需要程式設計人員關心這些內容。 
下圖是MapReduce的處理過程:

這裡寫圖片描述

 使用者提交任務給JobTracer,JobTracer把對應的使用者程式中的Map操作和Reduce操作對映至TaskTracer節點中;輸入模組負責把輸入資料分成小資料塊,然後把它們傳給Map節點;Map節點得到每一個key/value對,處理後產生一個或多個key/value對,然後寫入檔案;Reduce節點獲取臨時檔案中的資料,對帶有相同key的資料進行迭代計算,然後把終結果寫入檔案。

 如果這樣解釋還是太抽象,可以通過下面一個具體的處理過程來理解:(WordCount例項) 
 這裡寫圖片描述

Hadoop的核心是MapReduce,而MapReduce的核心又在於map和reduce函式。它們是交給使用者實現的,這兩個函式定義了任務本身。

map函式:接受一個鍵值對(key-value pair)(例如上圖中的Splitting結果),產生一組中間鍵值對(例如上圖中Mapping後的結果)。Map/Reduce框架會將map函式產生的中間鍵值對裡鍵相同的值傳遞給一個reduce函式。 
reduce函式:接受一個鍵,以及相關的一組值(例如上圖中Shuffling後的結果),將這組值進行合併產生一組規模更小的值(通常只有一個或零個值)(例如上圖中Reduce後的結果)

但是,Map/Reduce並不是萬能的,適用於Map/Reduce計算有先提條件: 
(1)待處理的資料集可以分解成許多小的資料集; 
(2)而且每一個小資料集都可以完全並行地進行處理; 
若不滿足以上兩條中的任意一條,則不適合適用Map/Reduce模式。