HDFS架構(gòu)圖
- HDFS集群遵循主從架構(gòu)( master/slave )燎窘。通常包括一個(gè)主節(jié)點(diǎn)和多個(gè)從節(jié)點(diǎn)摹闽。
- 在內(nèi)部,文件分塊存儲(chǔ)褐健,每個(gè)塊根據(jù)復(fù)制因子存儲(chǔ)在不同的從節(jié)點(diǎn)計(jì)算機(jī)上形成備份付鹿。
- 主節(jié)點(diǎn)存儲(chǔ)和管理文件系統(tǒng)namespace,即有關(guān)文件塊的信息,例如塊位置舵匾,權(quán)限等﹔從節(jié)點(diǎn)存儲(chǔ)文件的數(shù)據(jù)塊俊抵。
- 主從各司其職,互相配合纽匙,共同對(duì)外提供分布式文件存儲(chǔ)服務(wù)务蝠。當(dāng)然內(nèi)部細(xì)節(jié)對(duì)于用戶來說是透明的拍谐。
NameNode
主角色: namenode
- NameNode是Hadoop分布式文件系統(tǒng)的核心烛缔,架構(gòu)中的主角色。
- NameNode維護(hù)和管理文件系統(tǒng)元數(shù)據(jù)轩拨,包括名稱空間目錄樹結(jié)構(gòu)践瓷、文件和塊的位置信息、訪問權(quán)限等信息亡蓉。
- 基于此晕翠,NameNode成為了訪問HDFS的唯一入口。
- NameNode內(nèi)部通過內(nèi)存和磁盤文件兩種方式管理元數(shù)據(jù)砍濒。
- 其中磁盤上的元數(shù)據(jù)文件包括Fsimage內(nèi)存元數(shù)據(jù)鏡像文件和edits log ( Journal )編輯日志淋肾。
- 在Hadoop2之前,NameNode是單點(diǎn)故障爸邢。Hadoop 2中引入的高可用性樊卓。Hadoop群集體系結(jié)構(gòu)允許在群集中以熱備配
置運(yùn)行兩個(gè)或多個(gè)NameNode。
DataNode
從角色: datanode
- DataNode是Hadoop HDFS中的從角色杠河,
- DataNode的數(shù)量決定了HDFS集群的整體數(shù)據(jù)存儲(chǔ)能力。通過和NameNode配合維護(hù)著數(shù)據(jù)塊券敌。
Secondarynamenode
主角色輔助角色: secondarynamenode
- 除了DataNode和NameNode之外唾戚,還有另一個(gè)守護(hù)進(jìn)程,它稱為secondary NameNode待诅。充當(dāng)NameNode的輔助節(jié)點(diǎn)叹坦,但不能替代NameNode。
- 當(dāng)NameNode啟動(dòng)時(shí)卑雁,NameNode合并Fsimage和edits log文件以還原當(dāng)前文件系統(tǒng)名稱空間募书。如果edits log過大不利于加載,
HDFS重要特性
- 主從架構(gòu):(Namenode是HDFS主節(jié)點(diǎn)锐膜,Datanode是HDFS從節(jié)點(diǎn))。
- 分塊存儲(chǔ)機(jī)制:HDFS中的文件在物理上是分塊存儲(chǔ)( block )的}
\color{red}{默認(rèn)大小是128M ( 134217728 )}$。
- 副本機(jī)制:所有block都會(huì)有副本荷逞,每個(gè)文件的block大小 ( dfs.blocksize )和副本系數(shù)(dfs.replication )媒咳,默認(rèn)dfs.replication的值是3,也就是會(huì)額外再復(fù)制2份种远,連同本身總共3份副本涩澡。
- namespace:層次性文件組織結(jié)構(gòu)(類windows)
- 元數(shù)據(jù):文件自身屬性信息、文件塊位置映射信息
- 數(shù)據(jù)塊存儲(chǔ):文件的各個(gè)block的具體存儲(chǔ)管理由DataNode節(jié)點(diǎn)承擔(dān)坠敷。
HDFS Web Interfes
- 模塊功能解讀-Utilities
logs:各個(gè)datanode上的日志
Configuration:查看配置文件是否生效
Borwse the file system: 查看整個(gè)文件系統(tǒng)
HDFS寫數(shù)據(jù)流程
核心概念--Pipeline管道
Pipeline妙同,中文翻譯為管道。這是HDFS在上傳文件寫數(shù)據(jù)過程中采用的一種數(shù)據(jù)傳輸方式膝迎。
客戶端將數(shù)據(jù)塊寫入第一個(gè)數(shù)據(jù)節(jié)點(diǎn)粥帚,第一個(gè)數(shù)據(jù)節(jié)點(diǎn)保存數(shù)據(jù)之后再將塊復(fù)制到第二個(gè)數(shù)據(jù)節(jié)點(diǎn),后者保存后將其復(fù)制到第三個(gè)數(shù)據(jù)節(jié)點(diǎn)限次。
因?yàn)閿?shù)據(jù)以管道的方式,順序的沿著一個(gè)方向傳輸卖漫,這樣能夠充分利用每個(gè)機(jī)器的帶寬费尽,避免網(wǎng)絡(luò)瓶頸和高延遲時(shí)的連接,最小化推送所有數(shù)據(jù)的延時(shí)羊始。在線性推送模式下旱幼,每臺(tái)機(jī)器所有的出口寬帶都用于以最快的速度傳輸數(shù)據(jù),而不是在多個(gè)接受者之間分配寬帶店枣。lb
ACK應(yīng)答響應(yīng)
核心概念--默認(rèn)3副本存儲(chǔ)策略
默認(rèn)副本存儲(chǔ)策略是由指定速警。
第一塊副本∶優(yōu)先客戶端本地,否則隨機(jī)
第二塊副本∶不同于第一塊副本的不同機(jī)架鸯两。
第三塊副本:第二塊副本相同機(jī)架不同機(jī)器闷旧。
hdfs寫入數(shù)據(jù)流程
- Client 發(fā)起文件上傳請求(HDFS客戶端創(chuàng)建FileSystem對(duì)象實(shí)例DistributedFileSystem,F(xiàn)ileSystem封裝了與文件系統(tǒng)操作的相關(guān)方法钧唐。
)忙灼,通過 RPC 與 NameNode 建立通訊, NameNode 檢查目標(biāo)文件是否已存在,父目錄是否存在钝侠,返回是否可以上傳该园; - Client 請求第一個(gè) block 該傳輸?shù)侥男?DataNode 服務(wù)器上;
- NameNode 根據(jù)配置文件中指定的備份數(shù)量及機(jī)架感知原理進(jìn)行文件分配, 返回可用的 DataNode 的地址如:A, B, C帅韧;
Hadoop 在設(shè)計(jì)時(shí)考慮到數(shù)據(jù)的安全與高效里初, 數(shù)據(jù)文件默認(rèn)在 HDFS 上存放三份, 存儲(chǔ)策略為本地一份忽舟,同機(jī)架內(nèi)其它某一節(jié)點(diǎn)上一份双妨,不同機(jī)架的某一節(jié)點(diǎn)上一份淮阐。 - Client 請求 3 臺(tái) DataNode 中的一臺(tái) A 上傳數(shù)據(jù)(本質(zhì)上是一個(gè) RPC 調(diào)用,建立 pipeline )刁品,A 收到請求會(huì)繼續(xù)調(diào)用 B泣特,然后 B 調(diào)用 C哈恰,將整個(gè) pipeline 建立完成椭员, 后逐級(jí)返回 client;
- Client 開始往 A 上傳第一個(gè) block(先從磁盤讀取數(shù)據(jù)放到一個(gè)本地內(nèi)存緩存)欧漱,以 packet 為單位(默認(rèn)64K)兜挨,A 收到一個(gè) packet 就會(huì)傳給 B膏孟,B 傳給 C。A 每傳一個(gè) packet 會(huì)放入一個(gè)應(yīng)答隊(duì)列等待應(yīng)答暑劝;
- 數(shù)據(jù)被分割成一個(gè)個(gè) packet 數(shù)據(jù)包在 pipeline 上依次傳輸骆莹,在 pipeline 反方向上颗搂, 逐個(gè)發(fā)送 ack(命令正確應(yīng)答)担猛,最終由 pipeline 中第一個(gè) DataNode 節(jié)點(diǎn) A 將 pipelineack 發(fā)送給 Client;
- 當(dāng)一個(gè) block 傳輸完成之后丢氢,Client 再次請求 NameNode 上傳第二個(gè) block傅联,重復(fù)步驟 2;
hdfs讀數(shù)據(jù)流程
1疚察、HDFS客戶端創(chuàng)建FileSystem對(duì)象實(shí)例DistributedFileSystem蒸走,F(xiàn)ileSystem封裝了與文件系統(tǒng)操作的相關(guān)方法。調(diào)用DistributedFileSystem對(duì)象的open()方法來打開希望讀取的文件貌嫡。
2比驻、DistributedFileSystem使用RPC調(diào)用namenode來確定文件中前幾個(gè)塊的塊位置(分批次讀取)信息岛抄。
對(duì)于每個(gè)塊别惦,namenode返回具有該塊所有副本的datanode位置地址列表,并且該地址列表是排序好的夫椭,與客戶端的網(wǎng)絡(luò)`拓?fù)渚嚯x近的排序靠前掸掸。
3、DistributedFileSystem將FSDataInputStream輸入流返回到客戶端以供其讀取數(shù)據(jù)蹭秋。FSDataInputStream類是DFSInputStream類的包裝扰付。
4、客戶端在FSDataInputStream輸入流上調(diào)用read()方法仁讨。然后羽莺,已存儲(chǔ)DataNode地址的DFSInputStream連接到文件中第一個(gè)塊的最近的DataNode。數(shù)據(jù)從DataNode流回客戶端洞豁,結(jié)果客戶端可以在流上重復(fù)調(diào)用read ( )盐固。
5屠橄、當(dāng)該塊結(jié)束時(shí),DFSInputStream將關(guān)閉與DataNode的連接闰挡,然后尋找下一個(gè)塊的最佳datanode锐墙。這些操作對(duì)用戶來說是透明的。所以用戶感覺起來它一直在讀取一個(gè)連續(xù)的流长酗。
客戶端從流中讀取數(shù)據(jù)時(shí)溪北,也會(huì)根據(jù)需要詢問NameNode來檢索下一批數(shù)據(jù)塊的DataNode位置信息。
6夺脾、一旦客戶端完成讀取之拨,就對(duì)FSDataInputStream調(diào)用close()方法。
HDFS集群角色職責(zé)
NameNode職責(zé)
- NameNode是HDFS的核心咧叭,集群的主角色蚀乔,被稱為Master。
- NameNode僅存儲(chǔ)管理HDFS的元數(shù)據(jù)∶文件系統(tǒng)namespace操作維護(hù)目錄樹菲茬,文件和塊的位置信息吉挣。
- NameNode不存儲(chǔ)實(shí)際數(shù)據(jù)或數(shù)據(jù)集。數(shù)據(jù)本身實(shí)際存儲(chǔ)在DataNodes中婉弹。
- NameNode知道HDFS中任何給定文件的塊列表及其位置睬魂。使用此信息NameNode知道如何從塊中構(gòu)建文件。
- NameNode并不持久化存儲(chǔ)每個(gè)文件中各個(gè)塊所在的DataNode的位置信息镀赌,這些信息會(huì)在系統(tǒng)啟動(dòng)時(shí)從DataNode匯報(bào)中重建氯哮。
- NameNode對(duì)于HDFS至關(guān)重要,當(dāng)NameNode關(guān)閉時(shí)商佛,HDFS / Hadoop集群無法訪問喉钢。NameNode是Hadoop集群中的單點(diǎn)故障。
DataNode職責(zé)
- DataNode負(fù)責(zé)將實(shí)際數(shù)據(jù)存儲(chǔ)在HDFS中良姆。是集群的從角色肠虽,被稱為Slave。
- DataNode啟動(dòng)時(shí)歇盼,它將自己發(fā)布到NameNode并匯報(bào)自己負(fù)責(zé)持有的塊列表舔痕。根據(jù)NameNode的指令,執(zhí)行塊的創(chuàng)建豹缀、復(fù)制伯复、刪除操作。
- DataNode會(huì)定期( df.s..heartbeat..ntecxal配置項(xiàng)配置邢笙,默認(rèn)是3秒)向NameNode發(fā)送心跳啸如,如果NameNode長時(shí)間沒有接受到
- DataNode發(fā)送的心跳,NameNode就會(huì)認(rèn)為該DataNode失效氮惯。
- DataNode會(huì)定期向NameNode進(jìn)行自己持有的數(shù)據(jù)塊信息匯報(bào)叮雳,匯報(bào)時(shí)間間隔取參數(shù)dfs..blockrepoxt..intervalMsec,參數(shù)未配置的話默認(rèn)為6小時(shí).
- DataNode所在機(jī)器通常配置有大量的硬盤空間想暗。因?yàn)閷?shí)際數(shù)據(jù)存儲(chǔ)在DataNode中。
NameNode元數(shù)據(jù)管理
元數(shù)據(jù)管理概述
按存儲(chǔ)形式分為和
兩種帘不,分別存在內(nèi)存和磁盤上说莫。
- 內(nèi)存元數(shù)據(jù)
為了保證用戶操作元數(shù)據(jù)交互高效,延遲低) NameNode把所有的元數(shù)據(jù)都存儲(chǔ)在內(nèi)存中,我們叫做內(nèi)存元數(shù)據(jù)寞焙。內(nèi)存中的元數(shù)據(jù)是最完整的储狭,包括文件自身屬性信息、文件塊位置映射信息捣郊。
但是內(nèi)存的致命問題是辽狈,斷點(diǎn)數(shù)據(jù)丟失,數(shù)據(jù)不會(huì)持久化呛牲,因此NameNode又輔佐了元數(shù)據(jù)文件來保證元數(shù)據(jù)的安全完整刮萌。 - 元數(shù)據(jù)文件有兩種:fsimage內(nèi)存鏡像文件、Edits log編輯日志娘扩。
namenode元數(shù)據(jù)管理.jpg
元數(shù)據(jù)本地存儲(chǔ)目錄:hdfs-site.xml配置文件中
SecondaryNameNode
主角色NameNode的輔助角色着茸,定期做edit logs和fsimage文件的合并,更新NameNode元數(shù)據(jù)的內(nèi)容畜侦,減小NameNode上的壓力元扔。
SecondaryNameNode Checkpoint流程
NameNode存儲(chǔ)多目錄
namenode元數(shù)據(jù)存儲(chǔ)目錄由參數(shù): dfs.namenode.name.dir指定。
旋膳,各個(gè)目錄存儲(chǔ)的文件結(jié)構(gòu)和內(nèi)容都完全一樣,相當(dāng)于備份途事,這樣做的好處是當(dāng)其中一個(gè)目錄損壞了验懊,也不會(huì)影響到hadoop的元數(shù)據(jù),特別是當(dāng)其中一個(gè)目錄是NFS(網(wǎng)絡(luò)文件系統(tǒng)Network File System尸变,NFS )之上义图,即使你這臺(tái)機(jī)器損壞了,元數(shù)據(jù)也得到保存召烂。
Hadoop Archive文件歸檔
- Archive概述
Hadoop Archives可以有效的處理以上問題碱工,它可以把多個(gè)文件歸檔成為一個(gè)文件,歸檔成一個(gè)文件后還可以透明的訪問每一個(gè)文件奏夫。 - 查看Archive--查看歸檔之前的樣子
在查看har文件的時(shí)候怕篷,如果沒有指定訪問協(xié)議,默認(rèn)使用的就是hdfs ://酗昼,此時(shí)所能看到的就是歸檔之后的樣子廊谓。此外,Archive還提供了自己的har uri訪問協(xié)議麻削。如果用har uri去訪問的話蒸痹,索引春弥、標(biāo)識(shí)等文件就會(huì)隱藏起來,只顯示創(chuàng)建檔案之前的原文件:
Hadoop Archives的URI是︰
har : / / scheme-hostname : port/archivepath/fileinarchivescheme-hostname格式為hdfs-域名:端口叠荠。
Sequence File序列化文件
Sequence File是Hadoop提供的一種二進(jìn)制文件存儲(chǔ)格式匿沛。
一條數(shù)據(jù)稱之為record (記錄),底層直接以<key榛鼎,value>鍵值對(duì)形式序列化到文件中俺祠。
- 優(yōu)點(diǎn)
二級(jí)制格式存儲(chǔ),比文本文件更緊湊借帘。
支持不同級(jí)別壓縮(基于Record或Block壓縮)蜘渣。文件可以拆分和并行處理,適用于MapReduce程序肺然。 - 局限性
二進(jìn)制格式文件不方便查看蔫缸。
特定于hadoop,只有Java API可用于與之進(jìn)行交互际起。尚未提供多語言支持拾碌。