引言
最近了解到淘寶使用hadoop的項(xiàng)目多了起來(lái),hadoop對(duì)于許多測(cè)試人員來(lái)說(shuō)或許是個(gè)新鮮玩兒,因此,把自己之前整理的學(xué)習(xí)筆記整理發(fā)上來(lái),希望通過(guò)此系列文章快速了解Hadoop的基本概念和架構(gòu)原理,從而助于hadoop相關(guān)項(xiàng)目的測(cè)試?yán)斫夂蜏贤ā?br>Hadoop簡(jiǎn)介
Hadoop 是一個(gè)實(shí)現(xiàn)了 MapReduce 計(jì)算模型的開(kāi)源分布式并行編程框架,借助于 Hadoop, 程序員可以輕松地編寫分布式并行程序,將其運(yùn)行于計(jì)算機(jī)集群上,完成海量數(shù)據(jù)的計(jì)算。
如果你對(duì)Hadoop不熟悉,下面這些名詞你或許耳熟能詳,Google File System、Google Map/Reduce模型、lucene 、Nutch、阿里云梯、云計(jì)算等,他們都與Hadoop有著或深或淺的關(guān)系,原來(lái)Hadoop離我們?nèi)绱酥?,那么花些時(shí)間繼續(xù)了解它吧。
Hadoop的架構(gòu)
先拋開(kāi)Hadoop,簡(jiǎn)單地想想看,假設(shè)我們需要讀一個(gè)10TB的數(shù)據(jù)集,怎么辦?在傳統(tǒng)的系統(tǒng)上,這需要很長(zhǎng)時(shí)間,因?yàn)橛脖P的傳輸速度是受限的。一個(gè)簡(jiǎn)單的辦法是將數(shù)據(jù)存儲(chǔ)在多個(gè)磁盤上,同時(shí)從多個(gè)磁盤并行讀取數(shù)據(jù),這將大大減少讀取時(shí)間。
上面的方案需要解決兩個(gè)主要問(wèn)題,一個(gè)是硬件故障,要保證其中一個(gè)硬件壞了但數(shù)據(jù)仍然完整,Hadoop的文件系統(tǒng)HDFS(Hadoop Distributed Filesystem)提供了一種解決方式。另外一個(gè)問(wèn)題是如何并行讀取數(shù)據(jù)并合并保證正確性,通過(guò)MapReduce的編程模型可以簡(jiǎn)化這個(gè)問(wèn)題。簡(jiǎn)而言之,Hadoop提供了一個(gè)穩(wěn)定的共享存儲(chǔ)和分析系統(tǒng),存儲(chǔ)由HDFS實(shí)現(xiàn),分析由MapReduce實(shí)現(xiàn),這兩者構(gòu)成了Hadoop的核心功能。
HDFS集群有兩種節(jié)點(diǎn),以管理者-工作者模式運(yùn)行,即1個(gè)名稱節(jié)點(diǎn)(NameNode)和N個(gè)數(shù)據(jù)節(jié)點(diǎn)(DataNode)。其底層實(shí)現(xiàn)是將文件切割成塊,然后將這些塊存儲(chǔ)在不同的DataNode上。為了容錯(cuò)容災(zāi),每個(gè)塊還被復(fù)制多份存儲(chǔ)在不同的DataNode上。NameNode管理文件系統(tǒng)的命名空間,記錄每個(gè)文件被切割成了多少塊,這些塊可以從哪些DataNode上獲得,以及各個(gè)DataNode的狀態(tài)信息等。下圖是Hadoop集群的簡(jiǎn)化視圖
HDFS內(nèi)部通信都是基于標(biāo)準(zhǔn)的TCP/IP協(xié)議,NameNode 依賴來(lái)自每個(gè) DataNode 的定期心跳(heartbeat)消息。每條消息都包含一個(gè)塊報(bào)告,NameNode 可以根據(jù)這個(gè)報(bào)告驗(yàn)證塊映射和其他文件系統(tǒng)元數(shù)據(jù)。如果 DataNode 不能發(fā)送心跳消息,NameNode 將采取修復(fù)措施,重新復(fù)制在該節(jié)點(diǎn)上丟失的塊。更多HDFS的架構(gòu)和設(shè)計(jì)請(qǐng)閱讀http://hadoop./common/docs/current/cn/hdfs_design.html
上圖說(shuō)明了用 MapReduce 來(lái)處理大數(shù)據(jù)集的過(guò)程, 這個(gè) MapReduce 的計(jì)算過(guò)程簡(jiǎn)而言之,就是將大數(shù)據(jù)集分解為成若干個(gè)小數(shù)據(jù)集,每個(gè)(或若干個(gè))數(shù)據(jù)集分別由集群中的一個(gè)結(jié)點(diǎn)(一般就是一臺(tái)普通的計(jì)算機(jī))進(jìn)行處理并生成中間結(jié)果,然后這些中間結(jié)果又由大量的結(jié)點(diǎn)進(jìn)行合并, 形成最終結(jié)果。
計(jì)算模型的核心是 Map 和 Reduce 兩個(gè)函數(shù),這兩個(gè)函數(shù)由用戶負(fù)責(zé)實(shí)現(xiàn),功能是按一定的映射規(guī)則將輸入的 對(duì)轉(zhuǎn)換成另一個(gè)或一批 對(duì)輸出。下圖是一個(gè)簡(jiǎn)單的MapReduce示例,實(shí)現(xiàn)字?jǐn)?shù)統(tǒng)計(jì)功能。
Hadoop 的分布式并行運(yùn)算有一個(gè)作為主控的JobTracker,用于調(diào)度和管理其它的 TaskTracker, JobTracker 可以運(yùn)行于集群中任一臺(tái)計(jì)算機(jī)上。TaskTracker負(fù)責(zé)執(zhí)行任務(wù),必須運(yùn)行于 DataNode 上,即 DataNode 既是數(shù)據(jù)存儲(chǔ)結(jié)點(diǎn),也是計(jì)算結(jié)點(diǎn),這樣可以減少數(shù)據(jù)在網(wǎng)絡(luò)上的傳輸,降低對(duì)網(wǎng)絡(luò)帶寬的需求。 JobTracker 將 Map 任務(wù)和 Reduce 任務(wù)分發(fā)給空閑的 TaskTracker, 讓這些任務(wù)并行運(yùn)行,并負(fù)責(zé)監(jiān)控任務(wù)的運(yùn)行情況。如果某一個(gè) TaskTracker 出故障了,JobTracker 會(huì)將其負(fù)責(zé)的任務(wù)轉(zhuǎn)交給另一個(gè)空閑的 TaskTracker 重新運(yùn)行。
上面介紹的MapReduce、HDFS、分布式并行運(yùn)算是Hadoop最核心的功能。還有一些子項(xiàng)目提供補(bǔ)充性服務(wù)。如hive(提供基于sql的查詢語(yǔ)言查詢存儲(chǔ)在HDFS中的數(shù)據(jù))、Hbase(一種分布式、列存儲(chǔ)數(shù)據(jù)庫(kù),適用于需要實(shí)時(shí)讀寫、隨機(jī)訪問(wèn)超大數(shù)據(jù)集的場(chǎng)景)、Zookeeper(一個(gè)分布式、高可用性的協(xié)調(diào)服務(wù),提供分布式鎖之類的基本服務(wù))、pig(一種數(shù)據(jù)流語(yǔ)言和運(yùn)行環(huán)境,用以檢索非常大的數(shù)據(jù)集,使程序員能專注于數(shù)據(jù)而不是執(zhí)行本質(zhì))等。
小結(jié)
如果你堅(jiān)持看到這里,或許會(huì)覺(jué)得失望,介紹了一堆的概念和名詞,貌似對(duì)你的幫助不大,不要沮喪,第一次接觸分布式知識(shí)的人大都如此,至少你跟開(kāi)發(fā)又多了些共同語(yǔ)言,下次那個(gè)哥們沖你說(shuō)pig(豬)時(shí),你可以認(rèn)為他說(shuō)的是pig(一種數(shù)據(jù)流語(yǔ)言和運(yùn)行環(huán)境,用以檢索非常大的數(shù)據(jù)集,使程序員能專注于數(shù)據(jù)而不是執(zhí)行本質(zhì))。
在下篇文章中,我會(huì)來(lái)點(diǎn)干貨,介紹Hadoop的MapReduce基本編程,如果你有走讀代碼發(fā)現(xiàn)問(wèn)題或通過(guò)代碼了解本質(zhì)的習(xí)慣,不妨期待下。