Hadoop的三大核心組件分別是:
HDFS(Hadoop Distribute File System):hadoop的數(shù)據(jù)存儲(chǔ)工具记罚。
YARN(Yet Another Resource Negotiator,另一種資源協(xié)調(diào)者):Hadoop 的資源管理器坪稽。
Hadoop MapReduce:分布式計(jì)算框架
一.HDFS
1.HDFS概述
HDFS是google三大論文之一的GFS的開(kāi)源實(shí)現(xiàn),是一個(gè)高度容錯(cuò)性的系統(tǒng),適合部署在廉價(jià)的機(jī)器上的惩系,適合存儲(chǔ)海量數(shù)據(jù)的分布式文件系統(tǒng)舵揭。
在HDFS中,1個(gè)文件會(huì)被拆分成多個(gè)Block校赤,每個(gè)Block默認(rèn)大小為128M(可調(diào)節(jié))吆玖。這些Block被復(fù)制為多個(gè)副本,被存放在不同的主機(jī)上马篮,這也保證了HDFS的高容錯(cuò)性沾乘。
2.HDFS架構(gòu)
下圖展示了HDFS的基本架構(gòu)
HDFS采用Master/slave架構(gòu)模式,1一個(gè)Master(NameNode/NN)? 帶 N個(gè)Slaves(DataNode/DN)浑测。
從內(nèi)部來(lái)看翅阵,數(shù)據(jù)塊存放在DataNode上。NameNode執(zhí)行文件系統(tǒng)的命名空間,如打開(kāi)掷匠、關(guān)閉滥崩、重命名文件或目錄等,也負(fù)責(zé)數(shù)據(jù)塊到具體DataNode的映射槐雾。DataNode負(fù)責(zé)處理文件系統(tǒng)客戶端的文件讀寫(xiě)夭委,并在NameNode的統(tǒng)一調(diào)度下進(jìn)行數(shù)據(jù)庫(kù)的創(chuàng)建、刪除和復(fù)制工作募强。NameNode是所有HDFS元數(shù)據(jù)的管理者株灸,用戶數(shù)據(jù)永遠(yuǎn)不會(huì)經(jīng)過(guò)NameNode。
NameNode:
1)負(fù)責(zé)客戶端請(qǐng)求的響應(yīng)
2)負(fù)責(zé)元數(shù)據(jù)(文件的名稱(chēng)擎值、副本系數(shù)慌烧、Block存放的DN)的管理
DataNode:
1)存儲(chǔ)用戶的文件對(duì)應(yīng)的數(shù)據(jù)塊(Block)
2)要定期向NN發(fā)送心跳信息,匯報(bào)本身及其所有的block信息鸠儿,健康狀況
3.HDFS讀寫(xiě)流程
寫(xiě)數(shù)據(jù)流程
客戶端Client向遠(yuǎn)程的Namenode發(fā)起RPC請(qǐng)求
Namenode會(huì)檢查要?jiǎng)?chuàng)建的文件是否已經(jīng)存在屹蚊,創(chuàng)建者是否有權(quán)限進(jìn)行操作,成功則會(huì)為文件創(chuàng)建一個(gè)記錄进每, 否則會(huì)讓客戶端拋出異常汹粤;
當(dāng)客戶端開(kāi)始寫(xiě)入文件的時(shí)候, 客戶端會(huì)將文件切分成多個(gè)packets田晚, 并在內(nèi)部以數(shù)據(jù)隊(duì)列“data queue( 數(shù)據(jù)隊(duì)列) ”的形式管理這些packets嘱兼, 并向Namenode申請(qǐng)blocks, 獲取用來(lái)存儲(chǔ)replications的合適的datanode列表贤徒, 列表的大小根據(jù)Namenode中replication的設(shè)定而定芹壕;
開(kāi)始以pipeline( 管道) 的形式將packet寫(xiě)入所有的replications中。 客戶端把packet以流的方式寫(xiě)入第一個(gè)datanode接奈, 該datanode把該packet存儲(chǔ)之后踢涌, 再將其傳遞給在此pipeline中的下一個(gè)datanode, 直到最后一個(gè)datanode序宦, 這種寫(xiě)數(shù)據(jù)的方式呈流水線的形式睁壁。
最后一個(gè)datanode成功存儲(chǔ)之后會(huì)返回一個(gè)ack packet( 確認(rèn)隊(duì)列) , 在pipeline里傳遞至客戶端挨厚, 在客戶端的開(kāi)發(fā)庫(kù)內(nèi)部維護(hù)著”ack queue”堡僻, 成功收到datanode返回的ack packet后會(huì)從”ack queue”移除相應(yīng)的packet。
如果傳輸過(guò)程中疫剃, 有某個(gè)datanode出現(xiàn)了故障钉疫, 那么當(dāng)前的pipeline會(huì)被關(guān)閉, 出現(xiàn)故障的datanode會(huì)從當(dāng)前的pipeline中移除巢价, 剩余的block會(huì)繼續(xù)剩下的datanode中繼續(xù)以pipeline的形式傳輸牲阁, 同時(shí)Namenode會(huì)分配一個(gè)新的datanode固阁, 保持replications設(shè)定的數(shù)量。
客戶端完成數(shù)據(jù)的寫(xiě)入后城菊, 會(huì)對(duì)數(shù)據(jù)流調(diào)用close()方法备燃, 關(guān)閉數(shù)據(jù)流;
只要寫(xiě)入了dfs.replication.min的副本數(shù)( 默認(rèn)為1)凌唬,寫(xiě)操作就會(huì)成功并齐, 并且這個(gè)塊可以在集群中異步復(fù)制, 直到達(dá)到其目標(biāo)復(fù)本數(shù)(replication的默認(rèn)值為3)客税,因?yàn)閚amenode已經(jīng)知道文件由哪些塊組成况褪, 所以它在返回成功前只需要等待數(shù)據(jù)塊進(jìn)行最小量的復(fù)制。
讀數(shù)據(jù)流程
使用HDFS提供的客戶端Client更耻, 向遠(yuǎn)程的Namenode發(fā)起RPC請(qǐng)求测垛;
Namenode會(huì)視情況返回文件的部分或者全部block列表, 對(duì)于每個(gè)block秧均, Namenode都會(huì)返回有該block拷貝的DataNode地址食侮;
客戶端Client會(huì)選取離客戶端最近的DataNode來(lái)讀取block; 如果客戶端本身就是DataNode目胡, 那么將從本地直接獲取數(shù)據(jù)锯七;
讀取完當(dāng)前block的數(shù)據(jù)后, 關(guān)閉當(dāng)前的DataNode鏈接誉己, 并為讀取下一個(gè)block尋找最佳的DataNode起胰;
當(dāng)讀完列表block后, 且文件讀取還沒(méi)有結(jié)束巫延, 客戶端會(huì)繼續(xù)向Namenode獲取下一批的block列表;
讀取完一個(gè)block都會(huì)進(jìn)行checksum驗(yàn)證地消, 如果讀取datanode時(shí)出現(xiàn)錯(cuò)誤炉峰, 客戶端會(huì)通知Namenode, 然后再?gòu)南乱粋€(gè)擁有該block拷貝的datanode繼續(xù)讀脉执。
從上面的流程我們可以更清晰地理解HDFS各個(gè)組件的作用:namenode負(fù)責(zé)管理疼阔,不接觸數(shù)據(jù),datanode負(fù)責(zé)存儲(chǔ)數(shù)據(jù)半夷,在寫(xiě)數(shù)據(jù)時(shí)婆廊,每份數(shù)據(jù)復(fù)制多個(gè)副本以pipeline的方式在datanode中流動(dòng)。讀數(shù)據(jù)時(shí)巫橄,namenaode的作用只是提供datanode的信息淘邻,又客戶端自己從datanode讀取。
可以看出湘换,HDFS的一個(gè)特點(diǎn)是宾舅,適合一次寫(xiě)入多次存取的場(chǎng)景统阿。
另外還有一個(gè)小知識(shí)點(diǎn),在實(shí)際應(yīng)用中存儲(chǔ)數(shù)據(jù)時(shí)筹我,數(shù)據(jù)的第一份副本存放在離客戶端最近的一臺(tái)主機(jī)上扶平,第二份副本存放在與第一臺(tái)主機(jī)不同機(jī)架的主機(jī)上,第三個(gè)副本存放在與上一個(gè)副本同一個(gè)機(jī)架的不同主機(jī)上蔬蕊。這樣也是保證了HDFS的高容錯(cuò)性结澄。
二.YARN和MapReduce
為什么要把這兩個(gè)放到一塊說(shuō)呢,因?yàn)閅ARN可以說(shuō)是為了彌補(bǔ)MRv1的缺陷而誕生的岸夯,所以兩者放到一塊說(shuō)比較合適
1.什么是MapReduce
Hadoop的MapReduce是對(duì)google三大論文的MapReduce的開(kāi)源實(shí)現(xiàn)麻献,實(shí)際上是一種編程模型,是一個(gè)分布式的計(jì)算框架囱修,用于處理海量數(shù)據(jù)的運(yùn)算赎瑰。
2.MapReduce的流程
MapReduce主要由下面幾個(gè)過(guò)程組成,理解了這幾個(gè)過(guò)程破镰,基本上就可以理解MapReduce了
先上一張圖再說(shuō)
input:不用說(shuō)餐曼,就是輸入數(shù)據(jù),在編程中會(huì)有Textformat方法專(zhuān)門(mén)處理輸入鲜漩。
splitting:將數(shù)據(jù)分片源譬,一般來(lái)說(shuō)這個(gè)片和HDFS的分塊大小是一致的,默認(rèn)為128M孕似,但是這個(gè)大小也可以調(diào)節(jié)踩娘。(https://blog.csdn.net/dr_guo/article/details/51150278這篇博客對(duì)分片理解的很到位,可以看一下)喉祭。
record reader:record reader通過(guò)輸入格式將輸入split解析成記錄养渴。record reader的目的只是將輸入數(shù)據(jù)解析成記錄,但不負(fù)責(zé)解析記錄本身泛烙。它將數(shù)據(jù)轉(zhuǎn)化為鍵/值(key/value)對(duì)的形式理卑,并傳遞給mapper處理。通常鍵是數(shù)據(jù)在文件中的位置蔽氨,值是組成記錄的數(shù)據(jù)塊藐唠。以圖片中的程序(其實(shí)也就是wordcount)為例,spliting將輸入文本以行為單位分片鹉究,record reader把分片結(jié)果轉(zhuǎn)化為為多個(gè)以行偏移量為key宇立,對(duì)應(yīng)內(nèi)容為value的key/value對(duì),將這些key/value對(duì)作為參數(shù)輸入到mapping中
mapping:處理record reader解析的每個(gè)鍵/值對(duì)來(lái)產(chǎn)生0個(gè)或多個(gè)新的key/value對(duì)結(jié)果自赔。key/value的選擇對(duì)MapReduce作業(yè)的完成效率來(lái)說(shuō)非常重要妈嘹。key是數(shù)據(jù)在reducer中處理時(shí)被分組的依據(jù),value是reducer需要分析的數(shù)绍妨。上圖程序中蟋滴,將輸入的value進(jìn)行解析染厅,產(chǎn)生多個(gè)以單詞為key,單詞數(shù)量(其實(shí)也就是1)為value的新key/value對(duì)津函,并輸出肖粮。
shuffing:
數(shù)據(jù)從map中出來(lái)到進(jìn)入reduce之前稱(chēng)為shuffle階段,shuffle的處理任務(wù):將maptask輸出的處理結(jié)果數(shù)據(jù)尔苦,分發(fā)給reducetask涩馆,并在分發(fā)的過(guò)程中,對(duì)數(shù)據(jù)按key進(jìn)行了分區(qū)和排序允坚;
1魂那、maptask收集我們的map()方法輸出的k、v對(duì)稠项,放到內(nèi)存緩沖區(qū)中
2涯雅、從內(nèi)存緩沖區(qū)不斷溢出本地磁盤(pán)文件,可能會(huì)溢出多個(gè)文件
3展运、多個(gè)溢出文件會(huì)被合并成大的溢出文件
4活逆、在溢出過(guò)程中,及合并的過(guò)程中拗胜,都要調(diào)用partitoner進(jìn)行分組和針對(duì)key進(jìn)行排序
5蔗候、reducetask根據(jù)自己的分區(qū)號(hào),去各個(gè)maptask機(jī)器上取相應(yīng)的結(jié)果分區(qū)數(shù)據(jù)
6埂软、reducetask會(huì)取到同一個(gè)分區(qū)的來(lái)自不同maptask的結(jié)果文件锈遥,reducetask會(huì)將這些文件再進(jìn)行合并(歸并排序)
7、合并成大文件后勘畔,shuffle的過(guò)程也就結(jié)束了所灸,后面進(jìn)入reducetask的邏輯運(yùn)算過(guò)程(從文件中取出一個(gè)一個(gè)的鍵值對(duì)group,調(diào)用用戶自定義的reduce()方法)
備注:Shuffle中的緩沖區(qū)大小會(huì)影響到mapreduce程序的執(zhí)行效率炫七,原則上說(shuō)庆寺,緩沖區(qū)越大,磁盤(pán)io的次數(shù)越少诉字,執(zhí)行速度就越快。緩沖區(qū)的大小可以通過(guò)參數(shù)調(diào)整, 參數(shù):io.sort.mb 默認(rèn)100M
reduce:reduce階段是一個(gè)歸約過(guò)程知纷,實(shí)現(xiàn)單詞的計(jì)數(shù)壤圃。最后,得到整個(gè)文檔的詞頻統(tǒng)計(jì)琅轧。
MR過(guò)程中的數(shù)據(jù)流向:一個(gè)文件在HDFS中是分布存儲(chǔ)在不同節(jié)點(diǎn)的block中伍绳,每一個(gè)block對(duì)應(yīng)一個(gè)Mapper,每一條數(shù)據(jù)以K,V的形式進(jìn)入一個(gè)map()方法乍桂,map()方法中對(duì)數(shù)據(jù)進(jìn)行處理(數(shù)據(jù)篩選冲杀,業(yè)務(wù)邏輯以及分區(qū))效床,再將處理結(jié)果以K,V的形式寫(xiě)入環(huán)形緩沖區(qū),一個(gè)Mapper對(duì)應(yīng)一個(gè)context权谁,context對(duì)寫(xiě)入的數(shù)據(jù)按key進(jìn)行聚合剩檀、排序、歸約旺芽。context的大小默認(rèn)為100M沪猴,當(dāng)context容量達(dá)到80%或Mapper處理結(jié)束時(shí),context會(huì)向外溢出采章,形成許多小文件运嗜,小文件為一個(gè)K和許多V的集合。處理完成后悯舟,這些文件會(huì)發(fā)送到Reducer所在節(jié)點(diǎn)担租,在該節(jié)點(diǎn)的context中,會(huì)對(duì)不同節(jié)點(diǎn)發(fā)送過(guò)來(lái)的數(shù)據(jù)按key進(jìn)行再一次的聚合抵怎、排序和歸約奋救,最后進(jìn)入Reducer,在reduce方法中對(duì)同一個(gè)<key,value集合>進(jìn)行處理(業(yè)務(wù)邏輯)便贵,然后按照分區(qū)寫(xiě)入文件菠镇。
3.MapReduce1.x的架構(gòu)
MapReduce的架構(gòu)模式分為兩個(gè)階段,MR1.x和MR2.x時(shí)期承璃,先說(shuō)MR1.x利耍,上一張圖
MapReduce采用Master/Slave架構(gòu),1個(gè)JobTracker帶多個(gè)TaskTracker
1)JobTracker: JT
? ? 作業(yè)的管理者? ? ? 管理的
? ? 將作業(yè)分解成一堆的任務(wù):Task(MapTask和ReduceTask)
? ? 將任務(wù)分派給TaskTracker運(yùn)行
? ? 作業(yè)的監(jiān)控盔粹、容錯(cuò)處理(task作業(yè)掛了隘梨,重啟task的機(jī)制)
? ? 在一定的時(shí)間間隔內(nèi),JT沒(méi)有收到TT的心跳信息舷嗡,TT可能是掛了轴猎,TT上運(yùn)行的任務(wù)會(huì)被指派到其他TT上去執(zhí)行
2)TaskTracker: TT
? ? 任務(wù)的執(zhí)行者? ? ? 干活的
? ? 在TT上執(zhí)行我們的Task(MapTask和ReduceTask)
? ? 會(huì)與JT進(jìn)行交互:執(zhí)行/啟動(dòng)/停止作業(yè),發(fā)送心跳信息給JT
3)MapTask
? ? 自己開(kāi)發(fā)的map任務(wù)交由該Task處理
? ? 解析每條記錄的數(shù)據(jù)进萄,交給自己的map方法處理
? ? 將map的輸出結(jié)果寫(xiě)到本地磁盤(pán)(有些作業(yè)只僅有map沒(méi)有reduce==>HDFS)
4)ReduceTask
? ? 將Map Task輸出的數(shù)據(jù)進(jìn)行讀取
? ? 按照數(shù)據(jù)進(jìn)行分組傳給我們自己編寫(xiě)的reduce方法處理
? ? 輸出結(jié)果寫(xiě)到HDFS
可以看出來(lái)捻脖,這種架構(gòu)模式有很大的缺陷:
只有一個(gè)JobTracker,容易出現(xiàn)單點(diǎn)故障
JobTracker同時(shí)負(fù)責(zé)資源管理和作業(yè)調(diào)度中鼠,節(jié)點(diǎn)的工作壓力巨大可婶,可擴(kuò)展性差,出現(xiàn)了缺陷援雇,就該尋找解決的辦法矛渴,這時(shí)候,我們的YARN就閃亮登場(chǎng)了
MapReduce代碼
4.什么是YARN
Apache Hadoop YARN (Yet Another Resource Negotiator惫搏,另一種資源協(xié)調(diào)者)是一種新的 Hadoop 資源管理器具温,它是一個(gè)通用資源管理系統(tǒng)蚕涤,可為上層應(yīng)用提供統(tǒng)一的資源管理和調(diào)度,它的引入為集群在利用率铣猩、資源統(tǒng)一管理和數(shù)據(jù)共享等方面帶來(lái)了巨大好處揖铜。通過(guò)YARN,不同計(jì)算框架可以共享同一個(gè)HDFS集群上的數(shù)據(jù)剂习,享受整體的資源調(diào)度蛮位。
5.YARN的基本架構(gòu)
1)ResourceManager: RM
? ? 整個(gè)集群同一時(shí)間提供服務(wù)的RM只有一個(gè),負(fù)責(zé)集群資源的統(tǒng)一管理和調(diào)度
? ? 處理客戶端的請(qǐng)求: 提交一個(gè)作業(yè)鳞绕、殺死一個(gè)作業(yè)
? ? 監(jiān)控我們的NM失仁,一旦某個(gè)NM掛了,那么該NM上運(yùn)行的任務(wù)需要告訴我們的AM來(lái)如何進(jìn)行處理
2) NodeManager: NM
? ? 整個(gè)集群中有多個(gè)们何,負(fù)責(zé)自己本身節(jié)點(diǎn)資源管理和使用
? ? 定時(shí)向RM匯報(bào)本節(jié)點(diǎn)的資源使用情況
? ? 接收并處理來(lái)自RM的各種命令:?jiǎn)?dòng)Container
? ? 處理來(lái)自AM的命令
? ? 單個(gè)節(jié)點(diǎn)的資源管理
3) ApplicationMaster: AM
? ? 每個(gè)應(yīng)用程序?qū)?yīng)一個(gè):MR萄焦、Spark,負(fù)責(zé)應(yīng)用程序的管理
? ? 為應(yīng)用程序向RM申請(qǐng)資源(core冤竹、memory)拂封,分配給內(nèi)部task
? ? 需要與NM通信:?jiǎn)?dòng)/停止task,task是運(yùn)行在container里面鹦蠕,AM也是運(yùn)行在container里面
4) Container
? ? 封裝了CPU冒签、Memory等資源的一個(gè)容器
? ? 是一個(gè)任務(wù)運(yùn)行環(huán)境的抽象
5) Client
? ? 提交作業(yè)
? ? 查詢作業(yè)的運(yùn)行進(jìn)度
? ? 殺死作業(yè)
6.YARN的工作流程
用戶向YARN中提交應(yīng)用程序,其中包括ApplicationMaster程序钟病、啟動(dòng)ApplicationMaster命令萧恕、用戶程序等
resourceManager為該應(yīng)用程序分配第一個(gè)container,并與對(duì)應(yīng)的nodeManager通信肠阱,要求它在這個(gè)container中啟動(dòng)應(yīng)用程序的ApplicationMaster
ApplicationMaster首先向ResourceManager注冊(cè)票唆,這樣用戶可以直接通過(guò)ResourceManager查看應(yīng)用程序的運(yùn)行狀態(tài),然后它將為各個(gè)任務(wù)申請(qǐng)資源屹徘,并監(jiān)控它的運(yùn)行狀態(tài)走趋,直到運(yùn)行結(jié)束,即重復(fù)4~7
ApplicationMaster采用輪詢的方式通過(guò)RPC協(xié)議向resourceManager申請(qǐng)和領(lǐng)取資源
一旦ApplicationMaster申請(qǐng)到資源后噪伊,便與對(duì)應(yīng)的Nodemanager通信簿煌,要求它啟動(dòng)任務(wù)。
NodeManager為任務(wù)設(shè)置好運(yùn)行環(huán)境(包括環(huán)境變量鉴吹、JAR包姨伟、二進(jìn)制程序等)后,將任務(wù)啟動(dòng)命令寫(xiě)到一個(gè)腳本中拙寡,并通過(guò)運(yùn)行該腳本啟動(dòng)任務(wù)
各個(gè)任務(wù)通過(guò)某個(gè)RPC協(xié)議向ApplicationMaster匯報(bào)自己的狀態(tài)和進(jìn)度,以讓ApplicationMaster隨時(shí)掌握各個(gè)任務(wù)的運(yùn)行狀態(tài)琳水,從而可以在任務(wù)失敗時(shí)重新啟動(dòng)任務(wù)肆糕。在應(yīng)用程序運(yùn)行過(guò)程中般堆,用戶可隨時(shí)通過(guò)RPC向ApplicationMaster查詢應(yīng)用程序的當(dāng)前運(yùn)行狀態(tài)
應(yīng)用程序運(yùn)行完成后,ApplicationMaster向resourceManager注銷(xiāo)并關(guān)閉自己
6.MapReduce2.x的架構(gòu)
YARN將MapReduce1.x中的JobTracker拆分為兩部分:ResourceManager和Applicationaster诚啃。大大減輕了ResourceManager上的資源消耗與負(fù)擔(dān)淮摔,下面三MR2.x的架構(gòu)圖。
————————————————
版權(quán)聲明:本文為CSDN博主「沼澤魚(yú)97」的原創(chuàng)文章始赎,遵循CC 4.0 BY-SA版權(quán)協(xié)議和橙,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_40535323/article/details/82025442