小貼士為你帶來(lái)hadoop生態(tài)圈常用組件的基本原理通铲,方便看官快速理解組件基本原理,構(gòu)造hadoop生態(tài)圈的全貌器贩。??
一颅夺、MapReduce的工作原理
MapReduce的工作原理,簡(jiǎn)單來(lái)說(shuō)就是下面一幅圖蛹稍,
map函數(shù)接收一個(gè)<key,value>的輸入吧黄,同樣產(chǎn)生<key,value>的輸出。Hadoop中的有玄學(xué)意味的shuffle階段將具有相同中間key值的value集合到一起傳遞給reduce函數(shù)稳摄,reduce函數(shù)接受一個(gè)如<key,(list of values)>的輸入稚字,對(duì)value的集合進(jìn)行處理,輸出同樣為<key,value>形式厦酬。那么其具體的工作流程如何呢胆描?請(qǐng)看下圖,
客戶(hù)端:(1)從JobTrack中獲取當(dāng)前作業(yè)ID(2)檢查作業(yè)的相關(guān)路徑(3)計(jì)算作業(yè)的劃分仗阅,并將劃分信息寫(xiě)入job.split文件(4)將運(yùn)行所需要的資源復(fù)制到對(duì)應(yīng)的HDFS上(5)調(diào)用JobTracker對(duì)象來(lái)真正提交作業(yè)
JobTracker:(1)讀取客戶(hù)端在第3步中的job.split(2)創(chuàng)建對(duì)應(yīng)的map和reduce任務(wù)(3)創(chuàng)建兩個(gè)初始化的task昌讲,注意會(huì)根據(jù)TaskTracker在網(wǎng)絡(luò)中的位置,選擇一個(gè)距離此TaskTracker map任務(wù)最近的輸入劃分文件給該TaskTracker
TaskTracker:(1)執(zhí)行任務(wù)(2)更新任務(wù)執(zhí)行進(jìn)度和狀態(tài)(3)通過(guò)心跳監(jiān)測(cè)向JobTrack匯報(bào)狀態(tài)
如何對(duì)mapreduce進(jìn)行優(yōu)化呢减噪?主要根據(jù)執(zhí)行的過(guò)程短绸,從計(jì)算性能和IO操作上進(jìn)行優(yōu)化车吹,(1)任務(wù)調(diào)度時(shí),優(yōu)先將任務(wù)分配給空閑的機(jī)器醋闭,同時(shí)會(huì)盡量將map任務(wù)分配給InputSplit所在的機(jī)器窄驹,以減少網(wǎng)絡(luò)I/O的消耗(2)更加善于處理少量的大數(shù)據(jù)(3)設(shè)置map任務(wù)的數(shù)量時(shí),主要參考map的執(zhí)行時(shí)間证逻,設(shè)置reduce任務(wù)時(shí)乐埠,基于不同的考慮,通常是任務(wù)槽的0.95倍和1.75倍(4)map函數(shù)產(chǎn)生的中間數(shù)據(jù)有很多重復(fù)的數(shù)據(jù)囚企,利用combine函數(shù)進(jìn)行本地?cái)?shù)據(jù)的合并(5)可以針對(duì)map的輸出和最終的輸出結(jié)果進(jìn)行壓縮
眾多周知丈咐,Hadoop具有很強(qiáng)的容錯(cuò)性,具體體現(xiàn)在兩方面龙宏,(1)硬件故障棵逊,當(dāng)JobTracker發(fā)生故障時(shí),通過(guò)領(lǐng)導(dǎo)選舉算法從備用的JobTracker中選擇新的主JobTracker银酗,當(dāng)TaskTracker發(fā)生故障時(shí)辆影,如果是map任務(wù)則重新執(zhí)行,如果是reduce任務(wù)花吟,則分配新的TaskTracker完成未完成的任務(wù)秸歧;(2)任務(wù)失敗厨姚,JobTracker接收到TaskTracker的任務(wù)失敗通知時(shí)衅澈,通過(guò)重置任務(wù)狀態(tài),將其加入到調(diào)度隊(duì)列來(lái)重新分配任務(wù)執(zhí)行谬墙,嘗試4次仍沒(méi)有完成今布,作業(yè)就失敗了
插張圖,休息片刻拭抬,想起了《無(wú)問(wèn)西東》中的那句部默,如果提前了解你所要面對(duì)的人生,你是否還會(huì)有勇氣前來(lái)造虎?希望自己永葆童心傅蹂,簡(jiǎn)單充實(shí)......
二、HDFS的工作原理
HDFS便于進(jìn)行流式數(shù)據(jù)訪(fǎng)問(wèn)和處理超大文件算凿,那么該如何設(shè)計(jì)滿(mǎn)足此要求呢份蝴?邏輯塊橫空出世,和操作系統(tǒng)中的文件塊類(lèi)似氓轰,是一個(gè)抽象的概念婚夫,是文件存儲(chǔ)處理的邏輯單元。邏輯塊有以下優(yōu)勢(shì)署鸡,(1)通過(guò)將超大文件分成眾多塊案糙,存儲(chǔ)到不同的機(jī)器上限嫌,實(shí)現(xiàn)大文件存儲(chǔ)(2)簡(jiǎn)化存儲(chǔ)子系統(tǒng),固定大小的塊时捌,簡(jiǎn)化存儲(chǔ)系統(tǒng)的管理怒医,尤其是元數(shù)據(jù)信息和文件塊內(nèi)容可以分開(kāi)存儲(chǔ)(3)有利于分布式文件系統(tǒng)中復(fù)制容錯(cuò)的實(shí)現(xiàn)。
HDFS中有兩類(lèi)節(jié)點(diǎn)奢讨,NameNode和DataNode裆熙。NameNode管理文件系統(tǒng)的命名空間,從中可以獲得每個(gè)文件的每個(gè)塊的DataNode禽笑,這些信息不是永久保存入录,NameNode在每次啟動(dòng)時(shí)動(dòng)態(tài)地重建這些信息。DataNode用來(lái)執(zhí)行具體的任務(wù)佳镜,存儲(chǔ)文件塊僚稿,被客戶(hù)端和NameNode調(diào)用,同時(shí)基于心跳定時(shí)向NameNode發(fā)送存儲(chǔ)的文件塊信息蟀伸。
從下圖蚀同,我們學(xué)習(xí)HDFS的體系結(jié)構(gòu),
在此啊掏,我們主要關(guān)注DataNode的副本存放策略和NameNode的節(jié)點(diǎn)安全問(wèn)題蠢络。副本存放策略,主要考慮數(shù)據(jù)的可靠性和讀寫(xiě)的性能迟蜜。將副本存放在一個(gè)機(jī)架上刹孔,讀取數(shù)據(jù)時(shí)不能充分利用帶寬,提高寫(xiě)的效率娜睛,也不同保證數(shù)據(jù)的可靠性(節(jié)點(diǎn)故障)髓霞。將副本存放在不同的機(jī)架上,數(shù)據(jù)讀取時(shí)畦戒,可以充分利用帶寬方库,但是寫(xiě)操作效率低下,可以保證數(shù)據(jù)的可靠性障斋。HDFS的存放策略中纵潦,副本系數(shù)默認(rèn)是3,將一個(gè)副本放在不同機(jī)架的節(jié)點(diǎn)上垃环,另一個(gè)副本放在同一機(jī)架的另一個(gè)節(jié)點(diǎn)上邀层,最后一個(gè)副本放在不同機(jī)架的節(jié)點(diǎn)上。這一策略在不損害數(shù)據(jù)可靠性和讀取性能的情況下改進(jìn)了寫(xiě)操作晴裹。
NameNode啟動(dòng)后會(huì)進(jìn)入一個(gè)稱(chēng)為安全模式的特殊狀態(tài)被济,當(dāng)NameNode檢測(cè)確認(rèn)某個(gè)數(shù)據(jù)塊的副本數(shù)目達(dá)到最小值時(shí),該數(shù)據(jù)塊被認(rèn)為是副本安全的涧团;在一定百分比的數(shù)據(jù)塊被NameNode檢測(cè)安全后只磷,其將退出安全模式狀態(tài)经磅。NameNode容易產(chǎn)生單點(diǎn)故障,主要通過(guò)將NameNode中的元數(shù)據(jù)轉(zhuǎn)儲(chǔ)到遠(yuǎn)程的NFS文件系統(tǒng)中钮追,或者同步運(yùn)行一個(gè)Secondary NameNode预厌。
三、HBase的基本原理
HBase的表和關(guān)系型數(shù)據(jù)庫(kù)一致元媚,由行和列構(gòu)成轧叽。不同的是,HBase中的列組成列族刊棕,且至少有一個(gè)列族炭晒,y以u(píng)ser表為例,其物理存儲(chǔ)如下圖所示甥角,
那么似乎和Mysql中的存儲(chǔ)相似网严,如何體現(xiàn)其巨大威力呢?我們來(lái)看其邏輯模型嗤无,
行鍵類(lèi)似于Mysql中的主鍵震束,保證數(shù)據(jù)存儲(chǔ)的唯一性,info構(gòu)成其列族当犯,列族中包含name垢村、email和passwordd列,被稱(chēng)為列限定符嚎卫。同時(shí)嘉栓,HBase記錄操作的時(shí)間戳〕哿荩可以視為胸懈,以行鍵、列族恰响、列限定符和時(shí)間戳為鍵,以單元內(nèi)容為值進(jìn)行存儲(chǔ)涌献。那么既然是分布式的數(shù)據(jù)庫(kù)胚宦,其如何進(jìn)行讀寫(xiě)操作呢?下面一起來(lái)看看寫(xiě)操作燕垃,
MemStore是內(nèi)存里面的寫(xiě)入緩沖區(qū)枢劝,累積填滿(mǎn)后書(shū)寫(xiě)到硬盤(pán)上,生成一個(gè)HFile卜壕。WAL是預(yù)寫(xiě)入日志您旁,每臺(tái)服務(wù)器都維護(hù)一個(gè)WAL來(lái)記錄發(fā)生的變化。如果MemStore沒(méi)有刷寫(xiě)到硬盤(pán)上轴捎,服務(wù)器就崩潰了鹤盒,可以根據(jù)WAL中記錄的變化蚕脏,恢復(fù)數(shù)據(jù),有點(diǎn)類(lèi)似于Mysql中的binlog日志侦锯。讀操作呢驼鞭?HBase可以快速訪(fǎng)問(wèn)數(shù)據(jù),其在讀操作上使用了LRU(最近最少使用算法)緩存技術(shù)尺碰,也稱(chēng)為BlockCache挣棕,和MemStore在一個(gè)JVM堆里,用來(lái)保存從HFile里讀入內(nèi)存的頻繁訪(fǎng)問(wèn)的數(shù)據(jù)亲桥,如下圖所示洛心,
HBase是列式存儲(chǔ)數(shù)據(jù)庫(kù),每一個(gè)列族有自己的HFile文件题篷,意味著當(dāng)執(zhí)行讀操作時(shí)皂甘,HBase不需要讀取一行的數(shù)據(jù),只需要讀取用到的列族數(shù)據(jù)悼凑,有利于稀疏數(shù)據(jù)的高效存儲(chǔ)和快速讀取偿枕,如下圖所示,