
Google(自稱)為云計算概念的提出者,在自身多年的搜索引擎業務中構建了突破性的GFS(Google File System),從此文件系統進入分布式時代。除此之外,Google在GFS上如何快速分析和處理數據方面開創了MaPReduce并行計算框架,讓以往的高端服務器計算變為廉價的x86集群計算,也讓許多互聯網公司能夠從IOE(IBM小型機、Oracle數據庫以及EMC存儲)中解脫出來,例如:淘寶早就開始了去IOE化的道路。然而,Google之所以偉大就在于獨享技術不如共享技術,在2002-2004年間以三大論文的發布向世界推送了其云計算的核心組成部分GFS、MapReduce以及BigTable。
Google雖然沒有將其核心技術開源,但是這三篇論文已經向開源社區的大牛們指明了方向,一位大牛:Doug Cutting使用java語言對Google的云計算核心技術(主要是GFS和MapReduce)做了開源的實現。后來,Apache基金會整合Doug Cutting以及其他IT公司(如Facebook等)的貢獻成果,開發并推出了Hadoop生態系統。
Hadoop是一個搭建在廉價PC上的分布式集群系統架構,它具有高可用性、高容錯性和高可擴展性等優點。由于它提供了一個開放式的平臺,用戶可以在完全不了解底層實現細節的情形下,開發適合自身應用的分布式程序。
Hadoop系統的設計思想是層次化的設計結構,和OSI等設計思想類似,即,同層次之間不交互,每層只知道自己的工作,處理來自下一層提供的數據、信息。
Hadoop由HDFS、MapReduce、HBase、Hive和ZooKeeper等成員組成。

下圖是一個典型的Hadoop試驗集群的部署結構。

Hadoop各組件之間是如何依賴共存的呢?下圖為你展示:


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

DataNode
是文件存儲的基本單元。它存儲文件塊在本地文件系統中,保存了文件塊的meta-data,同時周期性的發送所有存在的文件塊的報告給NameNode。Client
就是需要獲取分布式文件系統文件的應用程序。下面來看看在HDFS上如何進行文件的讀/寫操作:

文件寫入:
Client向NameNode發起文件寫入的請求NameNode根據文件大小和文件塊配置情況,返回給Client它所管理部分DataNode的信息。Client將文件劃分為多個文件塊,根據DataNode的地址信息,按順序寫入到每一個DataNode塊中。
文件讀?。?/p>Client向NameNode發起文件讀取的請求NameNode返回文件存儲的DataNode的信息。Client讀取文件信息。
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計算有先提條件: ① 待處理的數據集可以分解成許多小的數據集;
② 而且每一個小數據集都可以完全并行地進行處理;
若不滿足以上兩條中的任意一條,則不適合使用Map/Reduce模式;
新聞熱點
疑難解答