隨著捕獲的數(shù)據(jù)的數(shù)量每年增加,我們的存儲(chǔ)也需要增加。很多公司正在認(rèn)識(shí)到“數(shù)據(jù)為王”這一道理,但是我們?nèi)绾畏治鲞@些數(shù)據(jù)呢?答案就是“通過Hadoop”。在這篇文章中,也是三部曲中的第一篇,Steven Haines 對(duì)Hadoop的架構(gòu)作了綜述,并從一定高度上演示了如何編寫MapReduce應(yīng)用程序。
在數(shù)據(jù)處理的發(fā)展進(jìn)程中,我們從文件轉(zhuǎn)到關(guān)系型數(shù)據(jù)庫(kù),從關(guān)系型數(shù)據(jù)庫(kù)轉(zhuǎn)到NoSQL數(shù)據(jù)庫(kù)。實(shí)質(zhì)上,隨著捕獲的數(shù)據(jù)的數(shù)據(jù)增加,我們的需求也在增加,傳統(tǒng)的模式已不能勝任。那些老的數(shù)據(jù)庫(kù)能處理好的數(shù)據(jù)大小是以MB或GB為單位的,但是現(xiàn)在很多公司認(rèn)識(shí)到“數(shù)據(jù)為王”,捕獲的數(shù)據(jù)數(shù)量是以TB和PB為單位的。即使采用NoSQL存儲(chǔ)數(shù)據(jù),“我們?nèi)绾畏治鋈绱藬?shù)量的數(shù)據(jù)?”這一問題依然存在。
對(duì)于這一問題最流行的答案就是:”Hadoop”.Hadoop 是一個(gè)開源框架,用于開發(fā)和執(zhí)行用來處理巨大數(shù)量數(shù)據(jù)的分布式應(yīng)用。Hadoop 用來運(yùn)行在大型的集群上,集群內(nèi)的商品機(jī)可以是你的數(shù)據(jù)中心內(nèi)不正在使用的機(jī)器,或者甚至是 Amazon EC2 映像。運(yùn)行在商品機(jī)上的危險(xiǎn)當(dāng)然就是如何處理故障(failure)。Hadoop的架構(gòu)假設(shè)硬件會(huì)產(chǎn)生故障,因此,它能夠很出色地應(yīng)對(duì)大部分故障。而且,Hadoop的架構(gòu)允許它近乎線性地伸縮,因此當(dāng)對(duì)處理能力的需求增加時(shí),唯一的限制就是你向集群添加更多機(jī)器的預(yù)算。
這篇文章將會(huì)對(duì)Hadoop的架構(gòu)作一概述,描述它如何實(shí)現(xiàn)上面所說的各種亮點(diǎn),并從一定高度上演示如何編寫MapReduce應(yīng)用程序。
Hadoop 架構(gòu)
在一定高度上來說,Hadoop的哲學(xué)概念就是推著分析程序靠近它打算分析的數(shù)據(jù),而非要求程序跨網(wǎng)絡(luò)地讀取數(shù)據(jù)。
因此,Hadoop 提供了自己的文件系統(tǒng),貼切地命名為Hadoop File System(HDFS)。當(dāng)你上傳數(shù)據(jù)到HDFS時(shí),Hadoop將會(huì)在整個(gè)集群內(nèi)分割你的數(shù)據(jù)(保存數(shù)據(jù)的多份副本以防硬件故障),然后會(huì)部署你的程序到包含該程序準(zhǔn)備操作的數(shù)據(jù)的機(jī)器上。
像許多NoSQL數(shù)據(jù)庫(kù)那樣,HDFS采用鍵(key)和值(value)而非關(guān)系組織數(shù)據(jù)。換句話說,每塊數(shù)據(jù)都有一個(gè)唯一的鍵(key),以及與該鍵相關(guān)聯(lián)的值。鍵之間的關(guān)系,如果存在的話,由程序定義,而非HDFS。并且實(shí)際上,你必須對(duì)你的問題域換一種稍微不同的方式思考,才能意識(shí)到Hadoop的強(qiáng)大威力(見下面關(guān)于MapReduce的章節(jié))。
組成Hadoop的組件為:
* HDFS:Hadoop文件系統(tǒng)是一種分布式文件系統(tǒng),被設(shè)計(jì)用來在集群內(nèi)跨節(jié)點(diǎn)地保存海量數(shù)據(jù)(此處海量被定義為文件的大小為100+TB)。Hadoop提供API及命令行接口與HDFS交互。
* MapReduce Application:下一章節(jié)將評(píng)論MapReduce的細(xì)節(jié),但是在此簡(jiǎn)單陳述,MapReduce 是一種函數(shù)式編程范式,用來分析你HDFS的單個(gè)記錄。然后它將結(jié)果組裝成可用的解決方案。Mapper負(fù)責(zé)數(shù)據(jù)處理步驟,而Reducer接受Mapper的輸出,并對(duì)同一鍵值的數(shù)據(jù)排序。
* Partitioner:partitioner負(fù)責(zé)把特定的分析問題劃分成可行的數(shù)據(jù)塊以供各種Mapper之用。HashPartioner 是一種partitioner,用來根據(jù)HDFS中的數(shù)據(jù)的行來劃分工作,但是你可以隨便創(chuàng)作自己的partitioner,如果你需要采用不同的方式劃分你的數(shù)據(jù)。
* Combiner:如果由于某些原因,你想進(jìn)行l(wèi)ocal reduce,即在數(shù)據(jù)送回到Hadoop之前combine數(shù)據(jù),那么你需要?jiǎng)?chuàng)作一個(gè)combiner。一個(gè)combiner執(zhí)行reduce步驟,即將值(value)根據(jù)鍵(key)分組結(jié)合,但是是在返回鍵/值(key/value)對(duì)到Hadoop進(jìn)行適當(dāng)?shù)膔eduction之前,在單一節(jié)點(diǎn)上操作。
* InputFormat:大部分時(shí)間默認(rèn)的reader會(huì)工作正常,但是如果你的數(shù)據(jù)不是按照標(biāo)準(zhǔn)的方式進(jìn)行的格式化,即“key, value”或者“key[tab]value”,那么你將需要定制一個(gè)InputFormat實(shí)現(xiàn)。
* OutputFormat:你的MapReduce應(yīng)用將會(huì)用InputFormat讀取數(shù)據(jù),然后通過OutputFormat將數(shù)據(jù)寫出。標(biāo)準(zhǔn)格式,例如“key[tab]value”,是被支持的,但是如果你想作別的事情,那么你需要?jiǎng)?chuàng)作你自己的OutputFormat實(shí)現(xiàn)。
又Hadoop應(yīng)用被部署在支持高度伸縮性和彈性的設(shè)施上,以下組件也被包含:
* NameNode: NameNode是HDFS的主節(jié)點(diǎn),控制從節(jié)點(diǎn)的DataNode的守護(hù)進(jìn)程(daemon);它知道你所有的數(shù)據(jù)存放在何處,知道數(shù)據(jù)如何被拆分成塊,知道這些數(shù)據(jù)塊被部署在哪個(gè)節(jié)點(diǎn)上,知道分布式文件系統(tǒng)的整體工作狀態(tài)。簡(jiǎn)而言之,它是整個(gè)Hadoop集群中最重要的節(jié)點(diǎn)。每個(gè)集群都有一個(gè)NameNode,并且NameNode是Hadoop集群中的single-point of failure(SPOF)。
更多詳細(xì)信息,請(qǐng)您微信關(guān)注“計(jì)算網(wǎng)”公眾號(hào):