小貼士為你帶來hadoop生態(tài)圈常用組件的基本原理,方便看官快速理解組件基本原理,構(gòu)造hadoop生態(tài)圈的全貌。??
一、MapReduce的工作原理
MapReduce的工作原理,簡單來說就是下面一幅圖,

map函數(shù)接收一個<key,value>的輸入,同樣產(chǎn)生<key,value>的輸出。Hadoop中的有玄學(xué)意味的shuffle階段將具有相同中間key值的value集合到一起傳遞給reduce函數(shù),reduce函數(shù)接受一個如<key,(list of values)>的輸入,對value的集合進(jìn)行處理,輸出同樣為<key,value>形式。那么其具體的工作流程如何呢?請看下圖,

客戶端:(1)從JobTrack中獲取當(dāng)前作業(yè)ID(2)檢查作業(yè)的相關(guān)路徑(3)計算作業(yè)的劃分,并將劃分信息寫入job.split文件(4)將運(yùn)行所需要的資源復(fù)制到對應(yīng)的HDFS上(5)調(diào)用JobTracker對象來真正提交作業(yè)
JobTracker:(1)讀取客戶端在第3步中的job.split(2)創(chuàng)建對應(yīng)的map和reduce任務(wù)(3)創(chuàng)建兩個初始化的task,注意會根據(jù)TaskTracker在網(wǎng)絡(luò)中的位置,選擇一個距離此TaskTracker map任務(wù)最近的輸入劃分文件給該TaskTracker
TaskTracker:(1)執(zhí)行任務(wù)(2)更新任務(wù)執(zhí)行進(jìn)度和狀態(tài)(3)通過心跳監(jiān)測向JobTrack匯報狀態(tài)
如何對mapreduce進(jìn)行優(yōu)化呢?主要根據(jù)執(zhí)行的過程,從計算性能和IO操作上進(jìn)行優(yōu)化,(1)任務(wù)調(diào)度時,優(yōu)先將任務(wù)分配給空閑的機(jī)器,同時會盡量將map任務(wù)分配給InputSplit所在的機(jī)器,以減少網(wǎng)絡(luò)I/O的消耗(2)更加善于處理少量的大數(shù)據(jù)(3)設(shè)置map任務(wù)的數(shù)量時,主要參考map的執(zhí)行時間,設(shè)置reduce任務(wù)時,基于不同的考慮,通常是任務(wù)槽的0.95倍和1.75倍(4)map函數(shù)產(chǎn)生的中間數(shù)據(jù)有很多重復(fù)的數(shù)據(jù),利用combine函數(shù)進(jìn)行本地數(shù)據(jù)的合并(5)可以針對map的輸出和最終的輸出結(jié)果進(jìn)行壓縮
眾多周知,Hadoop具有很強(qiáng)的容錯性,具體體現(xiàn)在兩方面,(1)硬件故障,當(dāng)JobTracker發(fā)生故障時,通過領(lǐng)導(dǎo)選舉算法從備用的JobTracker中選擇新的主JobTracker,當(dāng)TaskTracker發(fā)生故障時,如果是map任務(wù)則重新執(zhí)行,如果是reduce任務(wù),則分配新的TaskTracker完成未完成的任務(wù);(2)任務(wù)失敗,JobTracker接收到TaskTracker的任務(wù)失敗通知時,通過重置任務(wù)狀態(tài),將其加入到調(diào)度隊列來重新分配任務(wù)執(zhí)行,嘗試4次仍沒有完成,作業(yè)就失敗了
插張圖,休息片刻,想起了《無問西東》中的那句,如果提前了解你所要面對的人生,你是否還會有勇氣前來?希望自己永葆童心,簡單充實(shí)......

二、HDFS的工作原理
HDFS便于進(jìn)行流式數(shù)據(jù)訪問和處理超大文件,那么該如何設(shè)計滿足此要求呢?邏輯塊橫空出世,和操作系統(tǒng)中的文件塊類似,是一個抽象的概念,是文件存儲處理的邏輯單元。邏輯塊有以下優(yōu)勢,(1)通過將超大文件分成眾多塊,存儲到不同的機(jī)器上,實(shí)現(xiàn)大文件存儲(2)簡化存儲子系統(tǒng),固定大小的塊,簡化存儲系統(tǒng)的管理,尤其是元數(shù)據(jù)信息和文件塊內(nèi)容可以分開存儲(3)有利于分布式文件系統(tǒng)中復(fù)制容錯的實(shí)現(xiàn)。
HDFS中有兩類節(jié)點(diǎn),NameNode和DataNode。NameNode管理文件系統(tǒng)的命名空間,從中可以獲得每個文件的每個塊的DataNode,這些信息不是永久保存,NameNode在每次啟動時動態(tài)地重建這些信息。DataNode用來執(zhí)行具體的任務(wù),存儲文件塊,被客戶端和NameNode調(diào)用,同時基于心跳定時向NameNode發(fā)送存儲的文件塊信息。
從下圖,我們學(xué)習(xí)HDFS的體系結(jié)構(gòu),

在此,我們主要關(guān)注DataNode的副本存放策略和NameNode的節(jié)點(diǎn)安全問題。副本存放策略,主要考慮數(shù)據(jù)的可靠性和讀寫的性能。將副本存放在一個機(jī)架上,讀取數(shù)據(jù)時不能充分利用帶寬,提高寫的效率,也不同保證數(shù)據(jù)的可靠性(節(jié)點(diǎn)故障)。將副本存放在不同的機(jī)架上,數(shù)據(jù)讀取時,可以充分利用帶寬,但是寫操作效率低下,可以保證數(shù)據(jù)的可靠性。HDFS的存放策略中,副本系數(shù)默認(rèn)是3,將一個副本放在不同機(jī)架的節(jié)點(diǎn)上,另一個副本放在同一機(jī)架的另一個節(jié)點(diǎn)上,最后一個副本放在不同機(jī)架的節(jié)點(diǎn)上。這一策略在不損害數(shù)據(jù)可靠性和讀取性能的情況下改進(jìn)了寫操作。
NameNode啟動后會進(jìn)入一個稱為安全模式的特殊狀態(tài),當(dāng)NameNode檢測確認(rèn)某個數(shù)據(jù)塊的副本數(shù)目達(dá)到最小值時,該數(shù)據(jù)塊被認(rèn)為是副本安全的;在一定百分比的數(shù)據(jù)塊被NameNode檢測安全后,其將退出安全模式狀態(tài)。NameNode容易產(chǎn)生單點(diǎn)故障,主要通過將NameNode中的元數(shù)據(jù)轉(zhuǎn)儲到遠(yuǎn)程的NFS文件系統(tǒng)中,或者同步運(yùn)行一個Secondary NameNode。
三、HBase的基本原理
HBase的表和關(guān)系型數(shù)據(jù)庫一致,由行和列構(gòu)成。不同的是,HBase中的列組成列族,且至少有一個列族,y以user表為例,其物理存儲如下圖所示,

那么似乎和Mysql中的存儲相似,如何體現(xiàn)其巨大威力呢?我們來看其邏輯模型,

行鍵類似于Mysql中的主鍵,保證數(shù)據(jù)存儲的唯一性,info構(gòu)成其列族,列族中包含name、email和passwordd列,被稱為列限定符。同時,HBase記錄操作的時間戳。可以視為,以行鍵、列族、列限定符和時間戳為鍵,以單元內(nèi)容為值進(jìn)行存儲。那么既然是分布式的數(shù)據(jù)庫,其如何進(jìn)行讀寫操作呢?下面一起來看看寫操作,

MemStore是內(nèi)存里面的寫入緩沖區(qū),累積填滿后書寫到硬盤上,生成一個HFile。WAL是預(yù)寫入日志,每臺服務(wù)器都維護(hù)一個WAL來記錄發(fā)生的變化。如果MemStore沒有刷寫到硬盤上,服務(wù)器就崩潰了,可以根據(jù)WAL中記錄的變化,恢復(fù)數(shù)據(jù),有點(diǎn)類似于Mysql中的binlog日志。讀操作呢?HBase可以快速訪問數(shù)據(jù),其在讀操作上使用了LRU(最近最少使用算法)緩存技術(shù),也稱為BlockCache,和MemStore在一個JVM堆里,用來保存從HFile里讀入內(nèi)存的頻繁訪問的數(shù)據(jù),如下圖所示,

HBase是列式存儲數(shù)據(jù)庫,每一個列族有自己的HFile文件,意味著當(dāng)執(zhí)行讀操作時,HBase不需要讀取一行的數(shù)據(jù),只需要讀取用到的列族數(shù)據(jù),有利于稀疏數(shù)據(jù)的高效存儲和快速讀取,如下圖所示,
