就目前來說Hadoop已經(jīng)成為處理大數(shù)據(jù)的問題的必備的組件,許多的大廠都已經(jīng)在使用Hadoop軟件棧處理自己的問題,那為什么Hadoop技術(shù)棧這么流行?
其實(shí)不外乎幾個(gè)原因:首先Hadoop是完全開源的,雖然Oracle也可以搭建集群但是畢竟Oracle不是開源的,其次是當(dāng)數(shù)據(jù)量大的時(shí)候Oracle的計(jì)算也會(huì)變得很慢。其次是Hadoop的社區(qū)比較活躍,這樣解決問題的成本就會(huì)很低,因?yàn)楹芸赡芤恍﹩栴}早已經(jīng)被別人解決了。最后是Hadoop已經(jīng)被很多企業(yè)投入使用,有了實(shí)戰(zhàn)的經(jīng)驗(yàn),同時(shí)Hadoop有很廣泛的大數(shù)據(jù)解決面。
Hadoop1.0和Hadoop2.0
要學(xué)習(xí)hadoop首先就要認(rèn)識(shí)Hadoop的版本問題,因?yàn)榫W(wǎng)上很多資料都是很混淆的,有的介紹的其實(shí)是Hadoop1.0的問題,有的資料都搞混Hadoop1.0與Hadoop2.0,這對學(xué)習(xí)很不利。

首先我們應(yīng)該知道Hadoop1.0最大的問題是單點(diǎn)故障問題
Hadoop2.0就是針對Hadoop1.0的問題進(jìn)行解決與優(yōu)化。根據(jù)上圖我們知道,Hadoop1.0只支持單一的計(jì)算模型MapReduce,Hadoop2.0加入Yarn資源調(diào)度器,可以支持多種類型的計(jì)算模型,Yarn同時(shí)可以給不同的計(jì)算任務(wù)進(jìn)行計(jì)算資源的分配。
Hadoop2.0
- HDFS 主要提供了分布式存儲(chǔ)系統(tǒng),供了高可靠性、高擴(kuò)展性和高吞吐率的數(shù)據(jù)存儲(chǔ)服務(wù),同時(shí)基于對數(shù)據(jù)的操作基本屬于順序讀取的流式讀取,并且Hadoop可以承載草大文件的存儲(chǔ)。
- Yarn 主要負(fù)責(zé)集群的資源的管理,同時(shí)也可以進(jìn)行資源的分配。
- Mapreduce分布式計(jì)算框架,具有易于編程、高容錯(cuò)性和高擴(kuò)展性等優(yōu)點(diǎn).
HDFS

HDFS的基本原理,就是將大文件切分為同樣大小的數(shù)據(jù)塊(128MB),進(jìn)行冗余(3份)存儲(chǔ)在不同的機(jī)器上。同時(shí)調(diào)控集群的負(fù)載均衡。
如上圖所示,在Hadoop2.0中Namenode節(jié)點(diǎn)有兩個(gè)為了解決但節(jié)點(diǎn)故障問題,不過現(xiàn)在的備份節(jié)點(diǎn)是屬于靜態(tài)綁定,如果兩個(gè)節(jié)點(diǎn)都故障,就不得使用冷啟動(dòng)方式啟動(dòng)。
Yarn

了解Hadoop1.0的一定知道其是通過JobTracker和TaskTracker進(jìn)行任務(wù)與資源的分配,但是也存在單節(jié)點(diǎn)故障的問題。Yarn目前很復(fù)雜,但目前也符合主/從的模式,由上圖知,ResourceManager管理著NodeManage從節(jié)點(diǎn)。具有良好的擴(kuò)展性和高可用性。
MapReduce

上圖是MapReduce計(jì)算的過程,主要分為input,splitting,Mapping,shuffing,Reducing,output五個(gè)過程。但是其他復(fù)雜過程都被封裝了,我們只需要進(jìn)行編寫Mapping和Reducing的過程。
Hadoop生態(tài)系統(tǒng)

Hive
最初用于解決海量結(jié)構(gòu)化的日志數(shù)據(jù)統(tǒng)計(jì)問題,其是構(gòu)建在HDFS數(shù)據(jù)倉庫上的,其底層就是MapReduce計(jì)算實(shí)現(xiàn)。Hive定義了一種HiveQL語言,可以使Hive通過簡單的類SQL語句實(shí)現(xiàn)MapReduce程序。
SELECT word, COUNT(*) FROM doc LATERAL VIEW explode(split(text, ' ')) lTable
as word GROUP BY word;
pig
pig與hive類似,但是pig不管數(shù)據(jù)是不是關(guān)系型的,有無元數(shù)據(jù),是否嵌套都可以進(jìn)行操作,而且pig也可以在其他平臺(tái)上進(jìn)行使用。
定義了一種數(shù)據(jù)流語言——Pig Latin
① 加載數(shù)據(jù) input = load ‘/input/data’ as (line:chararray);
② 將字符串分割成單詞 words = foreach input generate flatten(TOKENIZE(line)) as word;
③ 對單詞進(jìn)行分組 grpd = group words by word;
④ 統(tǒng)計(jì)每組中單詞數(shù)量 cntd = foreach grpd generate group, COUNT(words);
⑤ 打印結(jié)果 dump cntd;
Mahout
基于Hadoop的機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘的分布 式計(jì)算框架
mahout主要包含以下5部分
頻繁挖掘模式:挖掘數(shù)據(jù)中頻繁出現(xiàn)的項(xiàng)集。
聚類:將諸如文本、文檔之類的數(shù)據(jù)分成局部相關(guān)的組。
分類:利用已經(jīng)存在的分類文檔訓(xùn)練分類器,對未分類的文檔進(jìn)行分類。
推薦引擎(協(xié)同過濾):獲得用戶的行為并從中發(fā)現(xiàn)用戶可能喜歡的事物。
頻繁子項(xiàng)挖掘:利用一個(gè)項(xiàng)集(查詢記錄或購物記錄)去識(shí)別經(jīng)常一起出現(xiàn)的項(xiàng)目。
Hbase

Table:表:類似于傳統(tǒng)傳統(tǒng)數(shù)據(jù)庫中的表
Column Family:列簇:Table在水平方向有一個(gè)或者多個(gè)
Column Family 組成
一個(gè)Column Family中可以由任意多個(gè)Column組 成
Row Key: 行鍵 ?Table的主鍵 ?Table中的記錄按照Row Key排序 ?Timestamp: 時(shí)間戳
每行數(shù)據(jù)均對應(yīng)一個(gè)時(shí)間戳 ?版本號
Client:
包含訪問HBase的接口,并維護(hù)cache來加快對HBase的訪問。說白了,就是用來訪問HBase的客戶端。
HMaster:
這個(gè)東西是HBase的主節(jié)點(diǎn),用來協(xié)調(diào)Client端應(yīng)用程序和HRegionServer的關(guān)系,管理分配HRegion給HRegionserver服務(wù)器。
HRegionServer:
Hbase的從節(jié)點(diǎn),管理當(dāng)前自己這臺(tái)服務(wù)器上面的HRegion,HRegion是Hbase表的基礎(chǔ)單元組建,存儲(chǔ)了分布式的表。HRegionserver負(fù)責(zé)切分在運(yùn)行過程中變得過大的HRegion。
HRegion:
一個(gè)Table可以有多個(gè)HRegion,HBase使用rowKey將表水平切割成多個(gè)HRegion,每個(gè)HRegion都紀(jì)錄了它的StartKey和EndKey(第一個(gè)HRegion的StartKey為空,最后一個(gè)HRegion的EndKey為空),由于RowKey是排序的,因而Client可以通過HMaster快速的定位每個(gè)RowKey在哪個(gè)HRegion中。HRegion由HMaster分配到相應(yīng)的HRegionServer中,然后由HRegionServer負(fù)責(zé)HRegion的啟動(dòng)和管理,和Client的通信,負(fù)責(zé)數(shù)據(jù)的讀(使用HDFS)。每個(gè)HRegionServer可以同時(shí)管理1000個(gè)左右的HRegion,出處請參看論文:BigTable(5 Implementation節(jié)):Each tablet server manages a set of tablets(typically we have somewhere between ten to a thousand tablets per tablet server))。
MemStore:
它是一個(gè)寫緩存,數(shù)據(jù)先WAL[write ahead log](也就是HLog它是一個(gè)二進(jìn)制文件,所有寫操作都會(huì)先保證將數(shù)據(jù)寫入這個(gè)Log文件后,才會(huì)真正更新MemStore,最后寫入HFile中),在寫入MemStore后,由MemStore根據(jù)一定的算法將數(shù)據(jù)Flush到底層HDFS文件中(HFile),一般而言,對于每個(gè)HRegion中的每個(gè)Column Family來說,有一個(gè)自己的MemStore。
StoreFile:
1個(gè)HStore,由一個(gè)MemStore和0~N個(gè)StoreFile組成。
HFile:
用于存儲(chǔ)HBase的數(shù)據(jù)(Cell/KeyValue),在HFile中的數(shù)據(jù)是按RowKey、Column Family、Column排序,對于相同的數(shù)據(jù)單元,排序則按照時(shí)間戳(Timestamp)倒敘排列。
Zookeeper:
HBase內(nèi)置有zookeeper,但一般我們會(huì)有其他的Zookeeper集群來監(jiān)管master和regionserver,Zookeeper通過選舉,保證任何時(shí)候,集群中只有一個(gè)活躍的HMaster,HMaster與HRegionServer 啟動(dòng)時(shí)會(huì)向ZooKeeper注冊,存儲(chǔ)所有HRegion的尋址入口,實(shí)時(shí)監(jiān)控HRegionserver的上線和下線信息。并實(shí)時(shí)通知給HMaster,存儲(chǔ)HBase的schema和table元數(shù)據(jù),默認(rèn)情況下,HBase 管理ZooKeeper 實(shí)例,Zookeeper的引入使得HMaster不再是單點(diǎn)故障。一般情況下會(huì)啟動(dòng)兩個(gè)HMaster,非Active的HMaster會(huì)定期的和Active HMaster通信以獲取其最新狀態(tài),從而保證它是實(shí)時(shí)更新的,因而如果啟動(dòng)了多個(gè)HMaster反而增加了Active HMaster的負(fù)擔(dān)。
Zookeeper
Zookeeper本質(zhì)上是一個(gè)MapReduce程序。

連接Hadoop與傳統(tǒng)數(shù)據(jù)庫之間的橋梁 支持多種數(shù)據(jù)庫,包括MySQL、DB2等 插拔式,用戶可根據(jù)需要支持新的數(shù)據(jù)庫 本質(zhì)上是一個(gè)MapReduce程序 充分利用了MR分布式并行的特點(diǎn),充分利用MR容錯(cuò)性
Oozie
如何對這些框架和作業(yè)進(jìn)行統(tǒng)一管理和調(diào)度?
不同作業(yè)之間存在依賴關(guān)系(DAG);
周期性作業(yè)
定時(shí)執(zhí)行的作業(yè)
作業(yè)執(zhí)行狀態(tài)監(jiān)控與報(bào)警(發(fā)郵件、短信等)

開源版本
Apache Hadoop
CDH
HDP
建議選擇公司發(fā)行版,比如CDH或HDP
不用考慮不同軟件間的版本匹配