技術(shù)分享:Hadoop框架
Hadoop由HDFS、MapReduce、HBase、Hive和ZooKeeper等成員組成,其中最基礎(chǔ)最重要元素為底層用于存儲(chǔ)集群中所有存儲(chǔ)節(jié)點(diǎn)文件的文件系統(tǒng)HDFS(Hadoop Distributed File System)來執(zhí)行MapReduce程序的MapReduce引擎。

- Pig是一個(gè)基于Hadoop的大規(guī)模數(shù)據(jù)分析平臺(tái),Pig為復(fù)雜的海量數(shù)據(jù)并行計(jì)算提供了一個(gè)簡單的操作和編程接口
- Hive是基于Hadoop的一個(gè)工具,提供完整的SQL查詢,可以將sql語句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行運(yùn)行
- ZooKeeper:高效的,可拓展的協(xié)調(diào)系統(tǒng),存儲(chǔ)和協(xié)調(diào)關(guān)鍵共享狀態(tài);
- HBase是一個(gè)開源的,基于列存儲(chǔ)模型的分布式數(shù)據(jù)庫;
- HDFS是一個(gè)分布式文件系統(tǒng),有著高容錯(cuò)性的特點(diǎn),適合那些超大數(shù)據(jù)集的應(yīng)用程序;
- MapReduce是一種編程模型,用于大規(guī)模數(shù)據(jù)集(大于1TB)的并行運(yùn)算。
下圖是一個(gè)典型的Hadoop集群的部署結(jié)構(gòu):

接著給出Hadoop各組件依賴共存關(guān)系:


HDFS是一個(gè)高度容錯(cuò)性的分布式文件系統(tǒng),可以被廣泛的部署于廉價(jià)的PC上。它以流式訪問模式訪問應(yīng)用程序的數(shù)據(jù),這大大提高了整個(gè)系統(tǒng)的數(shù)據(jù)吞吐量,因而非常適合用于具有超大數(shù)據(jù)集的應(yīng)用程序中。
HDFS的架構(gòu)如圖所示。HDFS架構(gòu)采用主從架構(gòu)(master/slave)。一個(gè)典型的HDFS集群包含一個(gè)NameNode節(jié)點(diǎn)和多個(gè)DataNode節(jié)點(diǎn)。NameNode節(jié)點(diǎn)負(fù)責(zé)整個(gè)HDFS文件系統(tǒng)中的文件的元數(shù)據(jù)的保管和管理,集群中通常只有一臺(tái)機(jī)器上運(yùn)行NameNode實(shí)例,DataNode節(jié)點(diǎn)保存文件中的數(shù)據(jù),集群中的機(jī)器分別運(yùn)行一個(gè)DataNode實(shí)例。在HDFS中,NameNode節(jié)點(diǎn)被稱為名稱節(jié)點(diǎn),DataNode節(jié)點(diǎn)被稱為數(shù)據(jù)節(jié)點(diǎn)。DataNode節(jié)點(diǎn)通過心跳機(jī)制與NameNode節(jié)點(diǎn)進(jìn)行定時(shí)的通信。

NameNode
NameNode可以看作是分布式文件系統(tǒng)中的管理者,存儲(chǔ)文件系統(tǒng)的meta-data,主要負(fù)責(zé)管理文件系統(tǒng)的命名空間,集群配置信息,存儲(chǔ)塊的復(fù)制。
DataNode
DataNode是文件存儲(chǔ)的基本單元。它存儲(chǔ)文件塊在本地文件系統(tǒng)中,保存了文件塊的meta-data,同時(shí)周期性的發(fā)送所有存在的文件塊的報(bào)告給NameNode。
Client
Client就是需要獲取分布式文件系統(tǒng)文件的應(yīng)用程序。
以下來說明HDFS如何進(jìn)行文件的讀寫操作:

文件寫入
- Client向NameNode發(fā)起文件寫入的請求
- NameNode根據(jù)文件大小和文件塊配置情況,返回給Client它所管理部分DataNode的信息。
- Client將文件劃分為多個(gè)文件塊,根據(jù)DataNode的地址信息,按順序?qū)懭氲矫恳粋€(gè)DataNode塊中。

文件讀取
- Client向NameNode發(fā)起文件讀取的請求
- NameNode返回文件存儲(chǔ)的DataNode的信息
- Client讀取文件信息
MapReduce是一種編程模型,用于大規(guī)模數(shù)據(jù)集的并行運(yùn)算。Map(映射)和Reduce(化簡),采用分而治之思想,先把任務(wù)分發(fā)到集群多個(gè)節(jié)點(diǎn)上,并行計(jì)算,然后再把計(jì)算結(jié)果合并,從而得到最終計(jì)算結(jié)果。多節(jié)點(diǎn)計(jì)算,所涉及的任務(wù)調(diào)度、負(fù)載均衡、容錯(cuò)處理等,都由MapReduce框架完成,不需要編程人員關(guān)心這些內(nèi)容。
下圖是MapReduce的處理過程:

用戶提交任務(wù)給JobTracer,JobTracer把對應(yīng)的用戶程序中的Map操作和Reduce操作映射至TaskTracer節(jié)點(diǎn)中;輸入模塊負(fù)責(zé)把輸入數(shù)據(jù)分成小數(shù)據(jù)塊,然后把它們傳給Map節(jié)點(diǎn);Map節(jié)點(diǎn)得到每一個(gè)key/value對,處理后產(chǎn)生一個(gè)或多個(gè)key/value對,然后寫入文件;Reduce節(jié)點(diǎn)獲取臨時(shí)文件中的數(shù)據(jù),對帶有相同key的數(shù)據(jù)進(jìn)行迭代計(jì)算,然后把終結(jié)果寫入文件。
如果這樣解釋還是太抽象,可以通過下面一個(gè)具體的處理過程來理解:(WordCount實(shí)例)

Hadoop的核心是MapReduce,而MapReduce的核心又在于map和reduce函數(shù)。它們是交給用戶實(shí)現(xiàn)的,這兩個(gè)函數(shù)定義了任務(wù)本身。
map函數(shù):接受一個(gè)鍵值對(key-value pair)(例如上圖中的Splitting結(jié)果),產(chǎn)生一組中間鍵值對(例如上圖中Mapping后的結(jié)果)。Map/Reduce框架會(huì)將map函數(shù)產(chǎn)生的中間鍵值對里鍵相同的值傳遞給一個(gè)reduce函數(shù)。
reduce函數(shù):接受一個(gè)鍵,以及相關(guān)的一組值(例如上圖中Shuffling后的結(jié)果),將這組值進(jìn)行合并產(chǎn)生一組規(guī)模更小的值(通常只有一個(gè)或零個(gè)值)(例如上圖中Reduce后的結(jié)果)
但是,Map/Reduce并不是***的,適用于Map/Reduce計(jì)算有先提條件:
- 待處理的數(shù)據(jù)集可以分解成許多小的數(shù)據(jù)集
- 每一個(gè)小數(shù)據(jù)集都可以完全并行地進(jìn)行處理
若不滿足以上兩條中的任意一條,則不適合適用Map/Reduce模式。