- 大數據基礎與應用
- 趙國生 王健 宋一兵主編
- 4164字
- 2021-12-15 16:00:27
2.6 Hadoop關鍵組件
認知和學習Hadoop,必須得了解Hadoop的構成,其中HDFS和MapReduce是Hadoop的核心組件,它們的產生都是基于Google的思想,Google的GFS(分布式文件系統)帶來了我們現在所認識的HDFS。本章還將介紹其他幾個不可或缺的Hadoop組件,如Hbase、Hive、ZooKeeper和Pig等。
2.6.1 HDFS
Hadoop分布式文件系統(Hadoop Distributed File System,HDFS)是Hadoop核心組件之一。支持以流式數據訪問模式來存取超大文件,活動在集群之上。
HDFS被設計成適合運行在通用硬件上的分布式文件系統。HDFS有著高容錯性的特點,并且設計用來部署在低廉的硬件上。而且它提供高吞吐量來訪問應用程序的數據,適合那些有著超大數據集的應用程序。HDFS放寬了POSIX的要求,這樣可以實現流的形式訪問文件系統中的數據。
HDFS的主要目標就是在存在故障的情況下也能可靠地存儲數據。三種最常見的故障是名字節點故障、數據節點故障和網絡斷開。
一個數據節點周期性發送一個心跳包到名字節點。網絡斷開會造成一組數據節點子集和名字節點失去聯系。名字節點根據缺失的心跳信息判斷故障情況。名字節點將這些數據節點標記為死亡狀態,不再將新的I/O請求轉發到這些數據節點上,這些數據節點上的數據將對HDFS不再可用,可能會導致一些塊的復制因子降低到指定的值。
名字節點檢查所有需要復制的塊,并開始復制它們到其他的數據節點上。重新復制在有些情況下是不可或缺的。從數據節點上取一個文件塊有可能是壞塊,壞塊的出現可能是存儲設備錯誤、網絡錯誤或軟件的漏洞。HDFS客戶端實現了HDFS文件內容的校驗。當一個客戶端創建一個HDFS文件時,它會為每一個文件塊計算一個校驗碼并將校驗碼存儲在同一個HDFS命名空間下的一個單獨的隱藏文件中。當客戶端訪問此文件時,它根據對應的校驗文件來驗證從數據節點接收到的數據。如果校驗失敗,客戶端可以選擇從其他擁有該塊副本的數據節點獲取這個塊。HDFS的工作原理如圖2-55所示。

圖2-55 HDFS的工作流程
2.6.2 HBase
HBase是Hadoop Database的簡稱,是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,利用HBase技術可在廉價PC Server上搭建起大規模結構化存儲集群。Hbase利用Hadoop HDFS作為其文件存儲系統,利用Hadoop MapReduce來處理Hbase中的海量數據,利用ZooKeeper作為協調工具。圖2-56為Hbase的商標。

圖2-56 Hbase的商標
HBase有兩個模型,分別是邏輯模型和物理模型。其中,邏輯模型主要是從用戶角度考慮的,而物理模型則是從實現HBase的角度來討論。HBase中的所有數據文件都存儲在Hadoop HDFS上,主要包括兩種文件類型,分別是Hfile、HLog File。
Hfile是HBase中Key Value數據的存儲格式,HFile是Hadoop的二進制格式文件。HFile文件是不定長的,長度固定的只有Trailer和FileInfo。HFile里的每個KeyValue對都是一個簡單的byte數組,有固定的結構。開始是兩個固定長度的數值,分別表示Key的長度和Value的長度。Key部分有復雜的結構,主要包括RowKey、Family、Qualifier等,在這里不做過多介紹;Value部分沒有這么復雜的結構,就是純粹的二進制數據。
HLog File是HBase中WAL(Write Ahead Log)的存儲格式。其實HLog文件就是一個普通的Hadoop Sequence File,Sequence File的Key是HLogKey對象,HLogKey中記錄了寫入數據的歸屬信息,除了table和region名字外,同時還包括sequence number和timestamp,timestamp是“寫入時間”,sequence number的起始值為0。HLog Sequece File的Value是HBase的Key Value對象,即對應HFile中的Key Value。
2.6.3 MapReduce
MapReduce是Hadoop系統的核心組件,由Google的MapReduce系統經過演變而來,主要解決海量大數據計算,也是眾多分布式計算模型中比較流行的一種,可以單獨使用,一般配合HDFS一起使用。
MapReduce是一種編程模型,用于大規模數據集(大于1TB)的并行運算。它極大地方便了編程人員在沒有掌握分布式并行編程的情況下,將自己的程序運行在分布式系統上。當前的軟件實現是指定一個Map(映射)函數,用來把一組鍵值對映射成一組新的鍵值對,指定并發的Reduce(歸約)函數,用來保證所有映射的每一個鍵值對共享相同的鍵組。
MapReduce的思想就是“分而治之”。比方說,1個人送100件貨需要5天,而5個人一起送貨就只需要1天,把貨物分成5個部分同時派送,就能提高效率。Mapper負責“分”,即把復雜的任務分解為若干個“簡單的任務”來處理。“簡單的任務”包含三層含義:一是數據或計算的規模相對原任務要大大縮小;二是就近計算原則,即任務會分配到存放著所需數據的節點上進行計算;三是這些小任務可以并行計算,彼此間幾乎沒有依賴關系。Reducer負責對map階段的結果進行匯總。至于需要多少個Reducer,用戶可以根據具體問題,通過在mapred-site.xml配置文件里設置參數mapred.reduce.tasks的值,缺省值為1。
【例2-1】使用MapReduce完成簡易的單詞去重功能。


2.6.4 Hive
Hive是基于Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,并提供簡單的SQL查詢功能,可以將SQL語句轉換為MapReduce任務運行,Hive在Hadoop之上提供了數據查詢功能,主要解決非關系型數據查詢問題。Hive定義了簡單的類SQL查詢語言,稱為HQL,它允許熟悉SQL的用戶查詢數據。Hive學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。Hive在加載數據過程中不會對數據進行任何的修改,只是將數據移動到HDFS中Hive設定的目錄下,因此Hive不支持對數據的改寫和添加,所有的數據都是在加載的時候確定的。
Hive并不適合那些需要低延遲的應用,最佳使用場合是大數據集的批處理作業,例如,網絡日志分析。Hive的設計很有特點,如支持索引,加快數據查詢;有不同的存儲類型(如純文本文件、HBase中的文件);將元數據保存在關系數據庫中等。圖2-57為Hbase的架構圖。

圖2-57 Hbase架構圖
Hive沒有專門的數據格式。
2.6.5 Pig
Apache Pig是一個高級過程語言,適合于使用Hadoop和MapReduce平臺來查詢大型半結構化數據集。通過對分布式數據集進行類似SQL的查詢,Pig可以簡化Hadoop的使用。
如果業務比較復雜,用MapReduce進行數據分析會是一個很復雜的事情。Pig的出現簡化了這一過程,用戶只需要專注于數據及業務本身,不用再糾結于數據的格式轉換以及MapReduce程序的編寫。本質上來說,當你使用Pig進行處理時,Pig本身會在后臺生成一系列的MapReduce操作來執行任務,但是這個過程對用戶來說是透明的。圖2-58為Pig在數據處理環節中的位置。

圖2-58 Pig在數據處理環節的位置
2.6.6 Mahout
Mahout簡單來說就是一個提供可擴展的機器學習領域經典的算法庫,旨在幫助開發人員更加方便快捷地創建智能應用程序。Mahout包含許多實現,包括聚類、分類、推薦過濾、頻繁子項挖掘。通過使用Apache Hadoop庫,Mahout可以有效地擴展到Hadoop集群。此外,通過使用Apache Hadoop庫,Mahout可以有效地擴展到云中。
2.6.7 ZooKeeper
ZooKeeper是一種為分布式應用所設計的高可用、高性能且一致的開源協調服務,能使大型系統的分布式進程相互同步,這樣所有提出請求的客戶端就可以得到一致的數據。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括維護配置信息、名字服務、分布式同步、組服務等。這些服務都被應用在分布式應用程序或者其他形式上。
由于ZooKeeper的開源特性,后來開發者在分布式鎖的基礎上,摸索出了其他的使用方法,如配置維護、組服務、分布式消息隊列、分布式通知/協調等。ZooKeeper服務是Hadoop的一個子項目,由一個服務器集群來提供,以避免單點故障。圖2-59為ZooKeeper的工作架構。

圖2-59 Zookeeper的工作架構
注意:ZooKeeper性能上的特點決定了它能夠被用在大型的、分布式的系統當中。從可靠性方面來說,它并不會因為一個節點的錯誤而崩潰。除此之外,它嚴格的序列訪問控制意味著復雜的控制原語可以應用在客戶端上。ZooKeeper在一致性、可用性、容錯性上的保證,也是ZooKeeper的成功之處,它獲得的一切成功都與它采用的協議——Zab協議是密不可分的。
2.6.8 Flume
Flume是Cloudera提供的一個高可用、高可靠、分布式的海量日志采集、聚合和傳輸的系統。Flume支持在日志系統中定制各類數據發送方,用于收集數據;同時,Flume具備對數據進行簡單處理,并寫到各種數據接受方的能力。
當前Flume有兩個版本,Flume 0.9X版本的統稱Flume-og,Flume1.X版本的統稱Flume-ng。由于Flume-ng經過重大重構,與Flume-og有很大不同,使用時請注意區分。
Flume-og采用了多Master的方式。為了保證配置數據的一致性,Flume引入了ZooKeeper用于保存配置數據,ZooKeeper本身可保證配置數據的一致性和高可用性。另外,在配置數據發生變化時,ZooKeeper可以通知Flume Master節點。Flume Master間使用Gossip協議同步數據。
Flume-ng最明顯的改動就是取消了集中管理配置的Master和ZooKeeper,變為一個純粹的傳輸工具。Flume-ng另一個主要的不同點是讀入數據和寫出數據現在由不同的工作線程處理(稱為Runner)。在Flume-og中,讀入線程同樣做寫出工作,如果寫出慢的話,它將阻塞Flume接收數據的能力。這種異步的設計使讀入線程可以順暢地工作而無需關注下游的任何問題。
2.6.9 Sqoop
Sqoop是一個用來將Hadoop和關系型數據庫中的數據相互轉移的工具,可以將一個關系型數據庫(如MySQL、Oracle、Postgres等)中的數據導入Hadoop的HDFS中,也可以將HDFS的數據導入關系型數據庫中。Sqoop專為大數據批量傳輸設計,能夠分割數據集并創建Hadoop任務來處理每個區塊。
盡管有以上的優點,在使用Sqoop的時候還有一些事情需要注意。
首先,對于默認的并行機制要小心。默認情況下的并行意味著Sqoop假設大數據在分區鍵范圍內是均勻分布的,這在當你的源系統是使用一個序列號發生器來生成主鍵的時候工作效率是比較高的。比方說,當你有一個10個節點的集群,那么工作負載是在這10臺服務器上平均分配的。但是,如果你的分割鍵是基于字母數字的,例如以“A”作為開頭的鍵值的數量會是以“M”作為開頭鍵值數量的20倍,那么工作負載就會變成從一臺服務器傾斜到另一臺服務器上。
如果擔心性能,那么可以考慮直接加載。直接加載繞過通常的Java數據庫連接導入,使用數據庫本身提供的直接載入工具,比如MySQL的mysqldump。但是有特定數據庫的限制。比如不能使用MySQL或者PostgreSQL的連接器來導入BLOB和CLOB類型。也沒有驅動支持從視圖的導入。
2.6.10 Ambari
Ambari是Hortonworks開源的Hadoop平臺的管理軟件,具備Hadoop組件的安裝、管理、運維等基本功能,提供Web UI進行可視化的集群管理,降低了大數據平臺的安裝、使用難度。
Ambari通過HDP將Hadoop的組件進行集成,通過棧的形式提供Service的組合使用,它主要解決的問題如下。
1)簡化了部署過程。在HDP棧中支持的Service只需要圖形化的安裝即可,可以方便地指定Master所在的節點,使集群快速運行起來。
2)通過Ambari Metrics實現集群狀態的監控,并通過集成Grafana進行數據的展示(CPU、內存、負載等)。
3)Service的高級配置。集群部署之后,可以方便地通過dashboard進行參數的修改(如HDFS的core-site等)。
4)快速鏈接。Ambari提供快速導向Hadoop組件原生管理界面的鏈接。
5)節點的擴展。
6)可定制的Alert功能。Ambari的報警信息可以自定義,使得用戶可以根據自己的需要,設置哪些情況下需要報警,哪些不需要。
7)增值功能。如HDFS的Rebalance DataNode、NameNode的HA等。
8)Ambari自身的用戶管理,基于RBAC賦予用戶對Hadoop集群的管理權限。
Ambari并沒有對Hadoop組件進行過多的功能集成,如日志分析等,只是提供了安裝、配置、啟停等功能,盡量保持了跟原生Hadoop組件的隔離性,對于該組件的具體操作,通過Quick Links直接導向原生的管理界面(如HBase Master UI),它的做法保持了對于Hadoop組件的低侵入性。