一桥嗤、HDFS簡介
1.1Hadoop2介紹
hadoop1是由HDFS和MapReduce組成毯辅,hadoop2由HDFS埂伦、YARN、MapReduce和其他的計算框架組成思恐。
(1)核心
HDFS——用于海量數(shù)據(jù)存儲沾谜;MapReduce——分布式計算;YARN——資源管理系統(tǒng)胀莹。
(2)改進
YARN——運行更多種類框架基跑;
NameNode HA——同時啟動2個NameNode。其中一個處于工作(Active)狀態(tài)描焰,另一個處于隨時待命(Standby)狀態(tài)媳否;
HDFS federation——由多個Namenode和一組Datanode組成,每一個Datanode會為多個塊池(block pool)存儲塊。
Hadoop RPC序列化擴展性——將數(shù)據(jù)類型模塊從RPC中獨立出來篱竭,成為一個獨立的可插拔模塊
1.2HDFS概述
HDFS是一個分布式文件系統(tǒng)力图,具有高容錯、高可靠掺逼、高可擴展性吃媒、高吞吐率的特點。它可以部署在廉價的通用硬件上吕喘,適合需要處理海量數(shù)據(jù)集的應用程序晓折。
(1)主要特性
支持超大文件——幾百M、GB甚至TB級的數(shù)據(jù)文件
檢測和快速應對硬件故障——HDFS的檢測和冗余機制很好克服了大量通用硬件平臺上的硬件故障問題
流式數(shù)據(jù)訪問——HDFS更關(guān)注數(shù)據(jù)訪問的高吞吐量
簡化一致性模型——一次寫入兽泄、多次讀取的訪問模式
(2)HDFS不適合以下場景
低延遲數(shù)據(jù)訪問漓概;大量的小文件;多用戶寫入文件病梢、修改文件胃珍。?
(3)HDFS體系結(jié)構(gòu)
由NameNode和DataNode構(gòu)成。其中:
①NameNode上保存著HDFS的名字空間蜓陌,任何對文件系統(tǒng)元數(shù)據(jù)產(chǎn)生修改的操作都作用于NameNode觅彰;
②DataNode將HDFS數(shù)據(jù)以文件的形式存儲在本地文件系統(tǒng)中。
(4)數(shù)據(jù)塊
數(shù)據(jù)塊是HDFS的文件存儲處理單元钮热,在Hadoop 2中默認大小為128MB填抬,可根據(jù)業(yè)務情況進行配置。
優(yōu)點:HDFS可以保存比存儲節(jié)點單一磁盤大的文件隧期;簡化了存儲子系統(tǒng)飒责、存儲管理,并消除分布式管理文件元數(shù)據(jù)的復雜性仆潮;方便容錯宏蛉,有利于數(shù)據(jù)復制。
1.3HDFS讀寫流程
(1)讀流程
①客戶端向遠程NameNode發(fā)送RPC請求性置;
②NameNode視情況返回文件部分或全部的block列表拾并,對于每個block,Namenode都會返回有該block拷貝的DataNode地址鹏浅;?
③客戶端開發(fā)庫Client會選取離客戶端最接近的DataNode來讀取block嗅义。如果客戶端本身就是DataNode,那么將從本地直接獲取數(shù)據(jù)隐砸;
?④讀取完當前block的數(shù)據(jù)后之碗,關(guān)閉與當前的DataNode連接,并為讀取下一個block尋找最佳的DataNode凰萨;
⑤ 當讀完列表的block后继控,且文件讀取還沒有結(jié)束,客戶端開發(fā)庫會繼續(xù)向Namenode獲取下一批的block列表胖眷;
⑥讀取完一個block都會進行校驗武通,如果讀取datanode時出現(xiàn)錯誤,客戶端會通知Namenode珊搀,然后再從下一個擁有該block拷貝的datanode繼續(xù)讀取冶忱。
(2)寫流程
①使用HDFS提供的客戶端開發(fā)庫Client,向遠程的Namenode發(fā)起RPC請求境析;
②Namenode會檢查要創(chuàng)建的文件是否已經(jīng)存在囚枪,創(chuàng)建者是否有權(quán)限進行操作,成功則會為文件創(chuàng)建一個記錄劳淆,否則會讓客戶端拋出異常链沼;
③當客戶端開始寫入文件的時候,開發(fā)庫會將文件切分成多個packets沛鸵,并在內(nèi)部以數(shù)據(jù)隊列"data queue"的形式管理這些packets括勺,并向Namenode申請新的blocks,獲取用來存儲replicas的合適的datanodes列表曲掰,列表的大小根據(jù)在Namenode中對replication的設置而定疾捍;
④開始以pipeline(管道)的形式將packet寫入所有的replicas中。開發(fā)庫把packet以流的方式寫入第一個datanode栏妖,該datanode把該packet存儲之后乱豆,再將其傳遞給在此pipeline中的下一個datanode,直到最后一個datanode吊趾,這種寫數(shù)據(jù)的方式呈流水線的形式宛裕;
⑤最后一個datanode成功存儲之后會返回一個ack packet,在pipeline里傳遞至客戶端论泛,在客戶端的開發(fā)庫內(nèi)部維護著"ack queue"续滋,成功收到datanode返回的ack packet后會從"ack queue"移除相應的packet;
⑥如果傳輸過程中孵奶,有某個datanode出現(xiàn)了故障疲酌,那么當前的pipeline會被關(guān)閉,出現(xiàn)故障的datanode會從當前的pipeline中移除了袁,剩余的block會繼續(xù)剩下的datanode中繼續(xù)以pipeline的形式傳輸朗恳,同時Namenode會分配一個新的datanode,保持replicas設定的數(shù)量载绿。
(3)創(chuàng)建子路徑流程:通過namenode進行創(chuàng)建粥诫、新加記錄。?
(4)刪除數(shù)據(jù)流程:客戶端與namenode交互崭庸,namenode指定datanode刪除相應的block怀浆。
二谊囚、YARN原理介紹
2.1 YARN產(chǎn)生背景
Hadoop 1.X缺陷:
①擴展性差:JobTracker同時兼?zhèn)淞速Y源管理和作業(yè)控制兩個功能,嚴重制約了整個集群的擴展性执赡;
②可靠性差:JobTracker存在單點故障镰踏,JobTracker出現(xiàn)問題將導致整個集群不可用;
③資源利用率低:基于槽位資源分布模式沙合,無法有效利用各種資源奠伪;
④無法支持多種計算框架:Hadoop 1支持內(nèi)存計算、流式計算首懈、迭代式計算等多種計算框架并存的情況绊率。
多種計算框架優(yōu)點:資源利用率高;運維成本低究履;數(shù)據(jù)共享滤否。
2.2 YARN基本架構(gòu)
YARN是一種Hadoop資源管理器。它是一個通用的資源管理系統(tǒng)最仑,可為上層應用提供統(tǒng)一的資源管理和調(diào)度顽聂,它的引入為集群在利用率、資源統(tǒng)一管理和數(shù)據(jù)共享等方面帶來了巨大好處盯仪。
(一)應用場景
長應用程序:不出意外紊搪,永不終止運行的應用程序,通常是一些服務全景,比如Storm Service(主要包括Nimbus和Supervisor兩類服務)耀石,HBase Service(包括Hmaster和RegionServer兩類服務)等;
短應用程序:一定時間內(nèi)(可能是秒級爸黄、分鐘級或小時級滞伟,盡管天級別或者更長時間的也存在,但非常少)可運行完成并正常退出的應用程序炕贵。
(二)結(jié)構(gòu)圖
YARN主要由ResourceManager梆奈、NodeManager、ApplicationMaster和Container等幾個組件構(gòu)成称开。YARN總體上仍然是Master/Slave結(jié)構(gòu)亩钟。ResourceManager為Master,NodeManager為Slave鳖轰。ResourceManager負責對各個NodeManager上的資源進行統(tǒng)一管理和調(diào)度清酥。當用戶提交一個應用程序時,需要提供一個用以跟蹤和管理這個程序的ApplicationMaster蕴侣,它負責向ResourceManager申請資源焰轻,并要求NodeManger啟動可以占用一定資源的任務。由于不同的ApplicationMaster被分布到不同的節(jié)點上昆雀,因此它們之間不會相互影響辱志。
①ResourceManager
作為一個全局的資源管理器蝠筑,負責整個系統(tǒng)的資源管理和分配,主要由調(diào)度器和應用程序管理器兩個組件構(gòu)成揩懒。
調(diào)度器:將系統(tǒng)中的資源分配給各個正在運行的應用程序什乙,可插拔組件,用戶可根據(jù)需要設計新的調(diào)度器旭从。
應用程序管理器:負責管理整個系統(tǒng)中所有的應用程序稳强,包括應用程序提交场仲、與調(diào)度器協(xié)商資源以啟動ApplicationMaster和悦、監(jiān)控ApplicationMaster運行狀態(tài)并在失敗時重新啟動它等。
②ApplicationMaster
用戶提交的每個應用程序均包含1個ApplicationMaster渠缕,主要功能包括與ResourceManager調(diào)度器協(xié)商以獲取資源鸽素,將得到的任務進一步分配給內(nèi)部的任務。負責與NodeManager通信以啟動/停止任務亦鳞、監(jiān)控所有任務運行狀態(tài)并在任務運行失敗時重新為任務申請資源以重啟任務等馍忽。
③NodeManager
作為每個節(jié)點上的資源和任務管理器,定時向ResourceManager匯報本節(jié)點上的資源使用情況和各個Container的運行狀態(tài)燕差,還接收并處理來自ApplicationMaster的Container啟動/停止等各種請求遭笋。
④Container
它是YARN中的資源抽象,它封裝了某個節(jié)點上的多維度資源徒探,如內(nèi)存瓦呼、CPU、磁盤测暗、網(wǎng)絡等央串,當ApplicationMaster向ResourceManager申請資源時,返回的資源便是用Container表示的碗啄。YARN會為每個任務分配一個Container质和,且該任務只能使用該Container中描述的資源。
(三)流程圖
①用戶向YARN中提交應用程序稚字,其中包括ApplicationMaster程序饲宿,啟動ApplicationMaster的命令,用戶程序等胆描;
②ResourceManger為該程序分配第一個Container褒傅,并與對應的NodeManger通訊,要求它在這個Container中啟動應用程序的ApplicationMaste袄友;
③ApplicationMaste首先向ResourceMange注冊殿托,這樣用戶可以直接通過ResourceMange查看應用程序的運行狀態(tài),然后將為各個任務申請資源剧蚣,并監(jiān)控它的運行狀態(tài)支竹,直到運行結(jié)束旋廷,重復4-7的步驟;
④ApplicationMaste采用輪詢的方式通過RPC協(xié)議向NodeManger申請和領取資源礼搁;
⑤一旦ApplicationMaste申請到資源后饶碘,便與對應的NodeManger通訊,要求它啟動任務馒吴;
⑥NodeManger為任務設置好運行環(huán)境(包括環(huán)境變量扎运、JAR包、二進制程序等)后饮戳,將任務啟動命令寫到一個腳本中豪治,并通過運行該腳本啟動任務;
⑦各個任務通過某個RPC協(xié)議向ApplicationMaste匯報自己的狀態(tài)和進度扯罐,以讓ApplicationMaste隨時掌握各個任務的運行狀態(tài)负拟,從而可以在任務失敗的時候重新啟動任務;
⑧應用程序運行完成后歹河,ApplicationMaste向ResourceManger注銷并關(guān)閉自己掩浙。
三、MapReduce原理介紹
3.1 MapReduce介紹
MapReduce是由Google公司研究提出的一種面向大規(guī)模數(shù)據(jù)處理的并行計算模型和方法秸歧,是Hadoop面向大數(shù)據(jù)并行處理的計算模型厨姚、框架和平臺。
MapReduce執(zhí)行流:
3.2MapReduce2運行原理
基于YARN的Mapreduce2工作流程:
(一)具體流程為:
1.客戶端向集群提交作業(yè)键菱;
2.Job從ResourceManager獲取新的作業(yè)應用程序ID谬墙;
3.客戶端檢查作業(yè)的輸出情況,計算輸入分片纱耻,并將作業(yè)jar包芭梯、配置、分片信息等作業(yè)資源復制到HDFS弄喘;
4.Job向ResourceManager提交作業(yè)玖喘;
5.ResourceManager接收到作業(yè)后,將作業(yè)請求傳遞給調(diào)度器蘑志,調(diào)度器根據(jù)作業(yè)信息為ResourceManager分配一個container累奈,然后ResourceManager在NodeManager的管理下,在container中啟動一個ApplicationMaster進程急但;
6.ApplicationMaster對作業(yè)進行初始化澎媒,并保持對作業(yè)的跟蹤,判斷作業(yè)是否完成波桩;
7.ApplicationMaster接受來自于HDFS的分片信息戒努,確定Map的數(shù)量,一個分片信息對應一個Map镐躲,而Reduce數(shù)量則可以在客戶端中設置储玫;
8.ApplicationMaster為本次作業(yè)的Map和Reduce以輪詢的方式向ResourceManager申請container侍筛;
9.ApplicationMaster獲取到container后,與NodeManager進行通訊啟動container撒穷;
10.任務開始前將任務需要的資源(jar包匣椰、配置和分布式緩存文件等)本地化;
11.container啟動Map端礼、Reduce任務禽笑。
(二)MapReduce2進度狀態(tài)更新:Map、Reduce任務向ApplicationMaster發(fā)送進度狀況蛤奥。
3.3 shuffle及排序
Mapreduce的map端輸出作為輸入傳遞給reduce端佳镜,并按鍵排序的過程稱為shuffle。
shuffle流程圖:
Map階段:
1.每個map存在一個環(huán)形內(nèi)存緩沖區(qū)(可以人為設置喻括,默認為100M)邀杏,若達到閾值(緩沖區(qū)大小的80%)贫奠,后臺內(nèi)容溢出至磁盤唬血。寫過程以輪詢方式將緩沖區(qū)內(nèi)容寫入特定路徑。
其中:
partition——map端寫入磁盤之前唤崭,線程首先根據(jù)reduce劃分相應分區(qū)拷恨。每個分區(qū)中后臺線程按照鍵排序。
combiner——相當于本地的reduce谢肾,可減少磁盤I/O或網(wǎng)絡I/O腕侄。
2.map端可能會有很多的溢出文件,其任務完成前生成已經(jīng)分區(qū)并排序的文件芦疏。默認map輸出不進行壓縮,不過可以設置數(shù)據(jù)壓縮。
Reduce階段:
Reduce通過http方式獲得map端輸出數(shù)據(jù)呕屎。若reduce接受的數(shù)據(jù)量相當小沼本,則復制至reduce的緩沖區(qū)(可設置)中,否則復制至磁盤薪捍,并進行所有map輸出數(shù)據(jù)的合并排序笼痹。最后對排好序的數(shù)據(jù)進行處理。