1. 說明
?Hadoop是個(gè)分布式的架構(gòu),它將海量數(shù)據(jù)處理工作分配到集群中的多個(gè)機(jī)器上運(yùn)行。前篇介紹了Hadoop的安裝,在安裝過程中會(huì)產(chǎn)生一些疑問,比如NameNode是什么東西?本篇就以問題&解答的方式介紹Hadoop的相關(guān)概念及其原理。
2. NameNode,DataNode,以及Secondary NameNode
?把Hadoop分為HDFS和MapReduce。HDFS為數(shù)據(jù)提供了存儲(chǔ),MapReduce為數(shù)據(jù)提供了計(jì)算。
?NameNode,DataNode以及Secondary NameNode都是屬于存儲(chǔ)部分,NameNode主要負(fù)責(zé)管理元信息,如文件名,目錄結(jié)構(gòu),屬性,數(shù)據(jù)塊存儲(chǔ)位置等等。DataNode負(fù)責(zé)數(shù)據(jù)塊的具體存取。SecondaryNameNode是NameNode的輔助工具,有兩個(gè)作用,一是鏡像備份,二是日志與鏡像的定期合并,注意:它并不是NameNode的備份。
3. ResourceManager與NodeManager
?ResourceManager和NodeManager屬于計(jì)算部分,ResourceManager負(fù)責(zé)集群中所有算力的統(tǒng)一管理和分配,NodeManager是每臺(tái)機(jī)器上的代理,負(fù)責(zé)容器管理,并監(jiān)控它們的資源使用情況,以及向ResourceManager提供資源使用報(bào)告。
4. MapReduce與YARN
?Hadoop將MapReduce框架升級(jí)到Y(jié)ARN(也叫MapRecudeV2)。原來MapReduce分為JobTracker和NodeTracker,分別用于分配集群中所有任務(wù)和管理單機(jī)任務(wù);而YARN改為ResourceManager和NodeManager,也分別針對(duì)主按和單機(jī),但YARN對(duì)每個(gè)應(yīng)用都建立了ApplicationMaster,它可以分布在ResourceManager以外的機(jī)器上,從而緩解了主控的壓力。

5. Master與slave
?Master和salve指的是集群中各臺(tái)主機(jī)主控或從屬的特性,即它們?cè)趆adoop中扮演的角色(每臺(tái)主機(jī)就好比一個(gè)人),一個(gè)集群中只有一個(gè)master(領(lǐng)導(dǎo)小組),它可以分布在一臺(tái)或多臺(tái)機(jī)器上(好比主管存儲(chǔ)的領(lǐng)導(dǎo)和主管計(jì)算的領(lǐng)導(dǎo)可以同一個(gè)人,也可以是不同的人),
?Salve(群眾)可以有很多,slave機(jī)器上主要部署NodeManager和DataNode(作為群眾干具體活,一個(gè)群眾可以干一樣或多樣工作,全部工作由群眾分擔(dān)),而在Master上部署NameNode和ResourceManager(作為領(lǐng)導(dǎo)分配任務(wù)),master如有多余算力,也可部署NodeManager和DataNode(領(lǐng)導(dǎo)也可以干點(diǎn)具體活)。
?如果只有一臺(tái)機(jī)器,可以把所有功能都讓它實(shí)現(xiàn),這就是偽分布式,如果機(jī)器多負(fù)荷大,可以把每種工作分配給專門的機(jī)器。需要注意的是管理的角色NameNode和ResourceManager只能各有一個(gè)。就好像一樣事兒好幾個(gè)領(lǐng)導(dǎo)同時(shí)管就亂了。
6. 集群中多臺(tái)服務(wù)器如何配置
?無論是master還是slave都需要安裝JDK和Hadoop,以及配置ssh及環(huán)境變量,但配置文件和啟動(dòng)方式不同;并且只在master上做格式化。
7. 程序如何讀取數(shù)據(jù)
?分布式文件系統(tǒng),算力和存儲(chǔ)都分布在多個(gè)機(jī)器上。NameNode為數(shù)據(jù)存儲(chǔ)提供統(tǒng)一的接口以便讀寫,具體在core-site.xml中設(shè)置。
?在程序?qū)用?,通過Hadoop的數(shù)據(jù)流(streaming)進(jìn)行流式處理,它有點(diǎn)像linux的管道機(jī)制,程序從標(biāo)準(zhǔn)輸入stdin讀入,寫入標(biāo)準(zhǔn)輸出stdout(在處理過程中請(qǐng)盡量保持流式,不要一次load太多到內(nèi)存)。相對(duì)來說它更適合處理像字符串一樣的流式數(shù)據(jù),而非大規(guī)律數(shù)據(jù)的統(tǒng)計(jì)。除了直接讀數(shù)據(jù)流,Python還提供封裝工具,如mrjob,dumbo,hadoopy,pydoop等等,使讀寫更加方便。
8. 程序如何切分運(yùn)算量
?Map可以開一個(gè)到多個(gè),reduce也可以開一個(gè)到多個(gè),具體根據(jù)業(yè)務(wù)邏輯分配。

9. 數(shù)據(jù)挖掘可否分布計(jì)算
?Mahout是Hadoop家族中的成員,是基于一個(gè)Hadoop的機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘的分布式計(jì)算框架。
10. Hadoop與Spark
?Hadoop是分布式數(shù)據(jù)處理的低層次抽象,通用,強(qiáng)壯,且保守,它使用HDFS存儲(chǔ),支持復(fù)雜的大規(guī)模數(shù)據(jù)。
?Spark是一個(gè)新興的大數(shù)據(jù)處理的引擎,是分布式大數(shù)據(jù)處理的高層次抽象。提供了除map和reduce之外更多的運(yùn)算符,這些操作是通過一個(gè)稱作彈性分布式數(shù)據(jù)集(resilient distributed datasets, RDDs)的分布式數(shù)據(jù)框架進(jìn)行的。它主要使用內(nèi)存存儲(chǔ),用于快速處理。
?Hadoop的YARN還可與Spark結(jié)合使用。
11. Hadoop與Zookeeper
?在集群的管理中Zookeeper負(fù)責(zé)分布式系統(tǒng)的協(xié)調(diào)工作。不僅適用于Hadoop集群,在其他的集群中也常被用到,比如此前介紹過的實(shí)現(xiàn)礦機(jī)集群的Zookeeper&Kafka。Zookeeper主要解決處理分布式應(yīng)用的“部分失敗”問題(比如某個(gè)關(guān)鏈節(jié)點(diǎn)宕機(jī)了),使集群更加穩(wěn)定地工作。