1. 程式人生 > >【Hadoop入門】Hadoop的架構介紹

【Hadoop入門】Hadoop的架構介紹

Hadoop的概念

  • Apache Hadoop是一款支援資料密集型分散式應用並以Apache 2.0許可協議釋出的開源軟體框架。它支援在商品硬體構建的大型叢集上執行的應用程式。Hadoop是根據Google公司發表的MapReduce和Google檔案系統的論文自行實作而成。

  • Hadoop是一套開源的軟體平臺,利用伺服器叢集,根據使用者的自定義業務邏輯,對海量資料進行分散式處理。誕生於2006年。

  • Hadoop與Google一樣,都是小孩命名的,是一個虛構的名字,沒有特別的含義。從計算機專業的角度看,Hadoop是一個分散式系統基礎架構,由Apache基金會開發。Hadoop的主要目標是對分散式環境下的“大資料”以一種可靠、高效、可伸縮的方式處理。

  • Hadoop框架透明地為應用提供可靠性和資料移動。它實現了名為MapReduce的程式設計正規化:應用程式被分割成許多小部分,而每個部分都能在叢集中的任意節點上執行或重新執行。

  • Hadoop還提供了分散式檔案系統,用以儲存所有計算節點的資料,這為整個叢集帶來了非常高的頻寬。MapReduce和分散式檔案系統的設計,使得整個框架能夠自動處理節點故障。它使應用程式與成千上萬的獨立計算的電腦和PB級的資料。

Hadoop的歷史及特點

1.Hadoop的歷史

這裡寫圖片描述

2.Hadoop的特點

  • 擴容能力(Scalable)
    能可靠地(reliably)儲存和處理千兆位元組(PB)資料

  • 成本低(Economical)
    可以通過普通機器組成的伺服器叢集來分發以及處理資料。這些伺服器幾圈總計可以達到千個節點。

  • 高效率(Efficient)
    通過分發資料,hadoop 可以在資料所在的節點上並行的(parallel)處理它們,這使得處理非常快。

  • 可靠性(Reliable)
    hadoop 能自動地維護資料的多份副本,並且在任務失敗後能自動重新部署(redeploy)計算任務

Hadoop的組成

1.Hadoop的核心元件

這裡寫圖片描述

分析:Hadoop的核心元件分為:HDFS(分散式檔案系統)、MapRuduce(分散式運算程式設計框架)、YARN(運算資源排程系統)

2.HDFS的檔案系統

這裡寫圖片描述

HDFS

1.定義

  • 整個Hadoop的體系結構主要是通過HDFS(Hadoop分散式檔案系統)來實現對分散式儲存的底層支援,並通過MR來實現對分散式並行任務處理的程式支援。

  • HDFS是Hadoop體系中資料儲存管理的基礎。它是一個高度容錯的系統,能檢測和應對硬體故障,用於在低成本的通用硬體上執行。HDFS簡化了檔案的一致性模型,通過流式資料訪問,提供高吞吐量應用程式資料訪問功能,適合帶有大型資料集的應用程式

2.組成

  • HDFS採用主從(Master/Slave)結構模型,一個HDFS叢集是由一個NameNode和若干個DataNode組成的。NameNode作為主伺服器,管理檔案系統名稱空間和客戶端對檔案的訪問操作。DataNode管理儲存的資料。HDFS支援檔案形式的資料。

  • 從內部來看,檔案被分成若干個資料塊,這若干個資料塊存放在一組DataNode上。NameNode執行檔案系統的名稱空間,如開啟、關閉、重新命名檔案或目錄等,也負責資料塊到具體DataNode的對映。DataNode負責處理檔案系統客戶端的檔案讀寫,並在NameNode的統一排程下進行資料庫的建立、刪除和複製工作。NameNode是所有HDFS元資料的管理者,使用者資料永遠不會經過NameNode。

  • 圖解
    這裡寫圖片描述
    分析:NameNode是管理者,DataNode是檔案儲存者、Client是需要獲取分散式檔案系統的應用程式。

MapReduce

1.定義

  • Hadoop MapReduce是google MapReduce 克隆版。

  • MapReduce是一種計算模型,用以進行大資料量的計算。其中Map對資料集上的獨立元素進行指定的操作,生成鍵-值對形式中間結果。Reduce則對中間結果中相同“鍵”的所有“值”進行規約,以得到最終結果。MapReduce這樣的功能劃分,非常適合在大量計算機組成的分散式並行環境裡進行資料處理。

2.組成

這裡寫圖片描述

分析:

(1)JobTracker

  • JobTracker叫作業跟蹤器,執行到主節點(Namenode)上的一個很重要的程序,是MapReduce體系的排程器。用於處理作業(使用者提交的程式碼)的後臺程式,決定有哪些檔案參與作業的處理,然後把作業切割成為一個個的小task,並把它們分配到所需要的資料所在的子節點。

  • Hadoop的原則就是就近執行,資料和程式要在同一個物理節點裡,資料在哪裡,程式就跑去哪裡執行。這個工作是JobTracker做的,監控task,還會重啟失敗的task(於不同的節點),每個叢集只有唯一一個JobTracker,類似單點的NameNode,位於Master節點

(2)TaskTracker

  • TaskTracker叫任務跟蹤器,MapReduce體系的最後一個後臺程序,位於每個slave節點上,與datanode結合(程式碼與資料一起的原則),管理各自節點上的task(由jobtracker分配),

  • 每個節點只有一個tasktracker,但一個tasktracker可以啟動多個JVM,執行Map Task和Reduce Task;並與JobTracker互動,彙報任務狀態,

  • Map Task:解析每條資料記錄,傳遞給使用者編寫的map(),並執行,將輸出結果寫入本地磁碟(如果為map-only作業,直接寫入HDFS)。

  • Reducer Task:從Map Task的執行結果中,遠端讀取輸入資料,對資料進行排序,將資料按照分組傳遞給使用者編寫的reduce函式執行。

Hive

1.定義

  • Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供完整的sql查詢功能,可以將sql語句轉換為MapReduce任務進行執行。

  • Hive是建立在 Hadoop 上的資料倉庫基礎構架。它提供了一系列的工具,可以用來進行資料提取轉化載入(ETL),這是一種可以儲存、查詢和分析儲存在 Hadoop 中的大規模資料的機制。

  • Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的使用者查詢資料。同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 無法完成的複雜的分析工作。

2.組成

這裡寫圖片描述

分析:Hive架構包括:CLI(Command Line Interface)、JDBC/ODBC、Thrift Server、WEB GUI、Metastore和Driver(Complier、Optimizer和Executor),這些元件分為兩大類:服務端元件和客戶端元件

3.客戶端與服務端元件

(1)客戶端元件:

  • CLI:Command Line Interface,命令列介面。

  • Thrift客戶端:上面的架構圖裡沒有寫上Thrift客戶端,但是Hive架構的許多客戶端介面是建立在Thrift客戶端之上,包括JDBC和ODBC介面。

  • WEBGUI:Hive客戶端提供了一種通過網頁的方式訪問Hive所提供的服務。這個介面對應Hive的HWI元件(Hive Web Interface),使用前要啟動HWI服務。

(2)服務端元件:

  • Driver元件:該元件包括Complier、Optimizer和Executor,它的作用是將HiveQL(類SQL)語句進行解析、編譯優化,生成執行計劃,然後呼叫底層的MapReduce計算框架

  • Metastore元件:元資料服務元件,這個元件儲存Hive的元資料,Hive的元資料儲存在關係資料庫裡,Hive支援的關係資料庫有Derby和Mysql。元資料對於Hive十分重要,因此Hive支援把Metastore服務獨立出來,安裝到遠端的伺服器叢集裡,從而解耦Hive服務和Metastore服務,保證Hive執行的健壯性;

  • Thrift服務:Thrift是Facebook開發的一個軟體框架,它用來進行可擴充套件且跨語言的服務的開發,Hive集成了該服務,能讓不同的程式語言呼叫Hive的介面。

4.Hive與傳統資料庫的異同

(1)查詢語言

由於 SQL 被廣泛的應用在資料倉庫中,因此專門針對Hive的特性設計了類SQL的查詢語言HQL。熟悉SQL開發的開發者可以很方便的使用Hive進行開發。

(2)資料儲存位置

Hive是建立在Hadoop之上的,所有Hive的資料都是儲存在HDFS中的。而資料庫則可以將資料儲存在塊裝置或者本地檔案系統中。

(3)資料格式

Hive中沒有定義專門的資料格式,資料格式可以由使用者指定,使用者定義資料格式需要指定三個屬性:列分隔符(通常為空格、”\t”、”\x001″)、行分隔符(”\n”)以及讀取檔案資料的方法(Hive中預設有三個檔案格式TextFile,SequenceFile以及RCFile)。

(4)資料更新

由於Hive是針對資料倉庫應用設計的,而資料倉庫的內容是讀多寫少的。因此,Hive中不支援
對資料的改寫和新增,所有的資料都是在載入的時候中確定好的。而資料庫中的資料通常是需要經常進行修改的,因此可以使用INSERT INTO … VALUES新增資料,使用UPDATE … SET修改資料。

(5)索引

Hive在載入資料的過程中不會對資料進行任何處理,甚至不會對資料進行掃描,因此也沒有對資料中的某些Key建立索引。Hive要訪問資料中滿足條件的特定值時,需要暴力掃描整個資料,因此訪問延遲較高。由於MapReduce的引入, Hive可以並行訪問資料,因此即使沒有索引,對於大資料量的訪問,Hive仍然可以體現出優勢。資料庫中,通常會針對一個或者幾個列建立索引,因此對於少量的特定條件的資料的訪問,資料庫可以有很高的效率,較低的延遲。由於資料的訪問延遲較高,決定了Hive不適合線上資料查詢。

(6)執行

Hive中大多數查詢的執行是通過Hadoop提供的MapReduce來實現的(類似select * from tbl的查詢不需要MapReduce)。而資料庫通常有自己的執行引擎。

(7)執行延遲

Hive在查詢資料的時候,由於沒有索引,需要掃描整個表,因此延遲較高。另外一個導致Hive執行延遲高的因素是MapReduce框架。由於MapReduce本身具有較高的延遲,因此在利用MapReduce執行Hive查詢時,也會有較高的延遲。相對的,資料庫的執行延遲較低。當然,這個低是有條件的,即資料規模較小,當資料規模大到超過資料庫的處理能力的時候,Hive的平行計算顯然能體現出優勢。

(8)可擴充套件性

由於Hive是建立在Hadoop之上的,因此Hive的可擴充套件性是和Hadoop的可擴充套件性是一致的(世界上最大的Hadoop叢集在Yahoo!,2009年的規模在4000臺節點左右)。而資料庫由於ACID語義的嚴格限制,擴充套件行非常有限。目前最先進的並行資料庫Oracle在理論上的擴充套件能力也只有100臺左右。

(9)資料規模

由於Hive建立在叢集上並可以利用MapReduce進行平行計算,因此可以支援很大規模的資料;對應的,資料庫可以支援的資料規模較小。

Hbase

1.定義

  • HBase – Hadoop Database,是一個高可靠性、高效能、面向列、可伸縮的分散式儲存系統,利用HBase技術可在廉價PC Server上搭建起大規模結構化儲存叢集。

  • HBase是Google Bigtable的開源實現,類似Google Bigtable利用GFS作為其檔案儲存系統,HBase利用Hadoop HDFS作為其檔案儲存系統;

  • Google執行MapReduce來處理Bigtable中的海量資料,HBase同樣利用Hadoop MapReduce來處理HBase中的海量資料;

  • Google Bigtable利用 Chubby作為協同服務,HBase利用Zookeeper作為協同服務。

2.組成

這裡寫圖片描述

這裡寫圖片描述

分析:從上圖可以看出:Hbase主要由Client、Zookeeper、HMaster和HRegionServer組成,由Hstore作儲存系統。

  • Client
    HBase Client使用HBase的RPC機制與HMaster和HRegionServer進行通訊,對於管理類操作,Client與 HMaster進行RPC;對於資料讀寫類操作,Client與HRegionServer進行RPC

  • Zookeeper
    Zookeeper Quorum 中除了儲存了 -ROOT- 表的地址和 HMaster 的地址,HRegionServer 也會把自己以 Ephemeral 方式註冊到 Zookeeper 中,使得 HMaster 可以隨時感知到各個HRegionServer 的健康狀態。

  • HMaster
    HMaster 沒有單點問題,HBase 中可以啟動多個 HMaster ,通過 Zookeeper 的 Master Election 機制保證總有一個 Master 執行,HMaster 在功能上主要負責 Table和Region的管理工作:

    • 管理使用者對 Table 的增、刪、改、查操作
    • 管理 HRegionServer 的負載均衡,調整 Region 分佈
    • 在 Region Split 後,負責新 Region 的分配
    • 在 HRegionServer 停機後,負責失效 HRegionServer 上的 Regions 遷移
  • HRegionServer

    • HRegionServer 主要負責響應使用者 I/O 請求,向 HDFS 檔案系統中讀寫資料,是 HBase 中最核心的模組。
    • HRegionServer 內部管理了一系列HRegion物件,每個 HRegion 對應了 Table 中的一個 Region,HRegion 中由多個 HStore 組成。每個 HStore 對應了Table中的一個Column Family 的儲存,可以看出每個 Column Family 其實就是一個集中的儲存單元,因此最好將具備共同IO特性的column放在一個Column Family中,這樣最高效。
  • HStore儲存是HBase儲存的核心了,其中由兩部分組成,一部分是MemStore,一部分是StoreFiles。

  • MemStore是Sorted Memory Buffer,使用者寫入的資料首先會放入MemStore,當MemStore滿了以後會Flush成一個StoreFile(底層實現是HFile), 當StoreFile檔案數量增長到一定閾值,會觸發Compact合併操作,將多個 StoreFiles 合併成一個 StoreFile,合併過程中會進行版本合併和資料刪除,因此可以看出HBase其實只有增加資料,所有的更新和刪除操作都是在後續的 compact 過程中進行的,這使得使用者的寫操作只要進入記憶體中就可以立即返回,保證了 HBase I/O 的高效能。當StoreFiles Compact後,會逐步形成越來越大的StoreFile,當單個 StoreFile 大小超過一定閾值後,會觸發Split操作,同時把當前 Region Split成2個Region,父 Region會下線,新Split出的2個孩子Region會被HMaster分配到相應的HRegionServer 上,使得原先1個Region的壓力得以分流到2個Region上。

Hadoop的應用例項

1.回顧Hadoop的整體架構

這裡寫圖片描述

2.Hadoop的應用——流量查詢系統

(1)流量查詢系統總體框架

這裡寫圖片描述

(2)流量查詢系統總體流程

這裡寫圖片描述

(3)流量查詢系統資料預處理功能框架

這裡寫圖片描述

(4)流量查詢系統資料預處理流程

這裡寫圖片描述

(5)流量查詢NoSQL資料庫功能框架

這裡寫圖片描述

(6)流量查詢服務功能框架

這裡寫圖片描述

(7)實時流計算資料處理流程圖

這裡寫圖片描述



本人才疏學淺,若有錯,請指出,謝謝!
如果你有更好的建議,可以留言我們一起討論,共同進步!
衷心的感謝您能耐心的讀完本篇博文!