柚子快報(bào)激活碼778899分享:Hadoop之HDFS概述
柚子快報(bào)激活碼778899分享:Hadoop之HDFS概述
Hadoop概述之HDFS
HDFS架構(gòu)概述優(yōu)缺點(diǎn)HDFS架構(gòu)HDFS文件塊大小HDFS的shell命令HDFS讀寫流程寫數(shù)據(jù)流程
HDFS讀數(shù)據(jù)流程N(yùn)ameNode 和 SecondaryNameNode工作機(jī)制DataNode工作機(jī)制DataNode數(shù)據(jù)完整性如何保證
端口名稱Hadoop2.xHadoop3.xNameNode內(nèi)部通信端口8020/9000NameNode HTTP UI500709870MapReduce查看執(zhí)行任務(wù)端口80888088歷史服務(wù)器通信端口1988819888
HDFS架構(gòu)概述
Hadoop Distributed File System,簡稱HDFS,是一個(gè)分布式文件系統(tǒng)。
隨著數(shù)據(jù)量越來越大,在一個(gè)操作系統(tǒng)存不下所有的數(shù)據(jù),那么就分配到更多的操作系統(tǒng)管理的磁盤中,但是不方便管理和維護(hù),迫切需要一種系統(tǒng)來管理多臺(tái)機(jī)器上的文件,這就是分布式文件管理系統(tǒng)。HDFS只是分布式文件管理系統(tǒng)中的一種。
HDFS的使用場(chǎng)景:適合一次寫入,多次讀出的場(chǎng)景。一個(gè)文件經(jīng)過創(chuàng)建、寫入和關(guān)閉之后就不需要改變。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn) 1)高容錯(cuò)性
數(shù)據(jù)自動(dòng)保存多個(gè)副本。它通過增加副本的形式,提高容錯(cuò)性。 2)適合處理大數(shù)據(jù)
數(shù)據(jù)規(guī)模:能夠處理數(shù)據(jù)規(guī)模達(dá)到GB、TB、甚至PB級(jí)別的數(shù)據(jù); 文件規(guī)模:能夠處理百萬規(guī)模以上的文件數(shù)量,數(shù)量相當(dāng)之大。 3)可構(gòu)建在廉價(jià)機(jī)器上,通過多副本機(jī)制,提高可靠性。
缺點(diǎn) 1)不適合低延時(shí)數(shù)據(jù)訪問,比如毫秒級(jí)的存儲(chǔ)數(shù)據(jù),是做不到的。
2)無法高效的對(duì)大量小文件進(jìn)行存儲(chǔ)。
存儲(chǔ)大量小文件的話,它會(huì)占用NameNode大量的內(nèi)存來存儲(chǔ)文件目錄和塊信息。這樣是不可取的,因?yàn)镹ameNode的內(nèi)存總是有限的; 小文件存儲(chǔ)的尋址時(shí)間會(huì)超過讀取時(shí)間,它違反了HDFS的設(shè)計(jì)目標(biāo)。 3)不支持并發(fā)寫入、文件隨機(jī)修改。
一個(gè)文件只能有一個(gè)寫,不允許多個(gè)線程同時(shí)寫; 僅支持?jǐn)?shù)據(jù)append(追加),不支持文件的隨機(jī)修改。
HDFS架構(gòu)
包含以下三個(gè)組件:
1)NameNode(nn):就是Master,它是一個(gè)主管、管理者。
(1)管理HDFS的名稱空間;
(2)配置副本策略;
(3)管理數(shù)據(jù)塊(Block)映射信息;
(4)處理客戶端讀寫請(qǐng)求。
2)DataNode:就是Slave。NameNode下達(dá)命令,DataNode執(zhí)行實(shí)際的操作。
(1)存儲(chǔ)實(shí)際的數(shù)據(jù)塊;
(2)執(zhí)行數(shù)據(jù)塊的讀/寫操作。
3)Client:就是客戶端。
(1)文件切分。文件上傳HDFS的時(shí)候,Client將文件切分成一個(gè)一個(gè)的Block,然后進(jìn)行上傳;
(2)與NameNode交互,獲取文件的位置信息;
(3)與DataNode交互,讀取或者寫入數(shù)據(jù);
(4)Client提供一些命令來管理HDFS,比如NameNode格式化;
(5)Client可以通過一些命令來訪問HDFS,比如對(duì)HDFS增刪查改操作;
4)Secondary NameNode:并非NameNode的熱備。當(dāng)NameNode掛掉的時(shí)候,它并不能馬上替換NameNode并提供服務(wù)。
(1)輔助NameNode,分擔(dān)其工作量,比如定期合并Fsimage和Edits,并推送給NameNode ;
(2)在緊急情況下,可輔助恢復(fù)NameNode。
HDFS文件塊大小
HDFS中的文件在物理上是分塊存儲(chǔ)(Block),塊的大小可以通過配置參數(shù)( dfs.blocksize)來規(guī)定,默認(rèn)大小在Hadoop2.x/3.x版本中是128M,1.x版本中是64M。
思考:為什么塊的大小不能設(shè)置太小,也不能設(shè)置太大? (1)HDFS的塊設(shè)置太小,會(huì)增加尋址時(shí)間,程序一直在找塊的開始位置;(2)如果塊設(shè)置的太大,從磁盤傳輸數(shù)據(jù)的時(shí)間會(huì)明顯大于定位這個(gè)塊開始位置所需的時(shí)間。導(dǎo)致程序在處理這塊數(shù)據(jù)時(shí),會(huì)非常慢。 總結(jié):HDFS塊的大小設(shè)置主要取決于磁盤傳輸速率。
HDFS的shell命令
HDFS shell命令基本以hadoop fs開頭,輸入hadoop fs會(huì)看到對(duì)應(yīng)指令和說明
hadoop fs #查看指令說明
下面幾個(gè)例子可以看出,基本和linux上的命令相似
hadoop fs -mkdir /mydir #創(chuàng)建文件夾
hadoop fs -ls /mydir #查看目錄信息
hadoop fs -put ./demo.txt /mydir #上傳文件到hdfs上
hadoop fs -get /mydir /demo.txt ./demo.txt #下載hdfs文件到本地
hadoop fs -chmod 666 /mydir /demo.txt #修改文件權(quán)限
HDFS讀寫流程
寫數(shù)據(jù)流程
(1)客戶端通過Distributed FileSystem模塊向NameNode請(qǐng)求上傳文件,NameNode檢查目標(biāo)文件是否已存在,父目錄是否存在。
(2)NameNode返回是否可以上傳。
(3)客戶端請(qǐng)求第一個(gè) Block上傳到哪幾個(gè)DataNode服務(wù)器上。
(4)NameNode返回3個(gè)DataNode節(jié)點(diǎn),分別為dn1、dn2、dn3。
(5)客戶端通過FSDataOutputStream模塊請(qǐng)求dn1上傳數(shù)據(jù),dn1收到請(qǐng)求會(huì)繼續(xù)調(diào)用dn2,然后dn2調(diào)用dn3,將這個(gè)通信管道建立完成。
(6)dn1、dn2、dn3逐級(jí)應(yīng)答客戶端。
(7)客戶端開始往dn1上傳第一個(gè)Block(先從磁盤讀取數(shù)據(jù)放到一個(gè)本地內(nèi)存緩存),以Packet為單位,dn1收到一個(gè)Packet就會(huì)傳給dn2,dn2傳給dn3;dn1每傳一個(gè)packet會(huì)放入一個(gè)應(yīng)答隊(duì)列等待應(yīng)答。
(8)當(dāng)一個(gè)Block傳輸完成之后,客戶端再次請(qǐng)求NameNode上傳第二個(gè)Block的服務(wù)器。(重復(fù)執(zhí)行3-7步)。
在HDFS寫數(shù)據(jù)的過程中,NameNode會(huì)選擇距離待上傳數(shù)據(jù)最近距離的DataNode接收數(shù)據(jù)。那么這個(gè)最近距離怎么計(jì)算呢?
依據(jù)節(jié)點(diǎn)距離,及待上傳數(shù)據(jù)所在節(jié)點(diǎn)和DataNode所在節(jié)點(diǎn)距離。 不同數(shù)據(jù)中心節(jié)點(diǎn)距離=6; 同數(shù)據(jù)中心不同機(jī)架=4; 同機(jī)架不同節(jié)點(diǎn)=2; 相同節(jié)點(diǎn)=0;
HDFS讀數(shù)據(jù)流程
(1)客戶端通過DistributedFileSystem向NameNode請(qǐng)求下載文件,NameNode通過查詢?cè)獢?shù)據(jù),找到文件塊所在的DataNode地址。
(2)挑選一臺(tái)DataNode(就近原則,然后隨機(jī))服務(wù)器,請(qǐng)求讀取數(shù)據(jù)。
(3)DataNode開始傳輸數(shù)據(jù)給客戶端(從磁盤里面讀取數(shù)據(jù)輸入流,以Packet為單位來做校驗(yàn))。
(4)客戶端以Packet為單位接收,先在本地緩存,然后寫入目標(biāo)文件。
NameNode 和 SecondaryNameNode工作機(jī)制
思考:NameNode中的元數(shù)據(jù)是存儲(chǔ)在哪里的?
首先,我們做個(gè)假設(shè),如果存儲(chǔ)在NameNode節(jié)點(diǎn)的磁盤中,因?yàn)榻?jīng)常需要進(jìn)行隨機(jī)訪問,還有響應(yīng)客戶請(qǐng)求,必然是效率過低。因此,元數(shù)據(jù)需要存放在內(nèi)存中。但如果只存在內(nèi)存中,一旦斷電,元數(shù)據(jù)丟失,整個(gè)集群就無法工作了。因此產(chǎn)生在磁盤中備份元數(shù)據(jù)的FsImage。
這樣又會(huì)帶來新的問題,當(dāng)在內(nèi)存中的元數(shù)據(jù)更新時(shí),如果同時(shí)更新FsImage,就會(huì)導(dǎo)致效率過低,但如果不更新,就會(huì)發(fā)生一致性問題,一旦NameNode節(jié)點(diǎn)斷電,就會(huì)產(chǎn)生數(shù)據(jù)丟失。因此,引入Edits文件(只進(jìn)行追加操作,效率很高)。每當(dāng)元數(shù)據(jù)有更新或者添加元數(shù)據(jù)時(shí),修改內(nèi)存中的元數(shù)據(jù)并追加到Edits中。這樣,一旦NameNode節(jié)點(diǎn)斷電,可以通過FsImage和Edits的合并,合成元數(shù)據(jù)。
但是,如果長時(shí)間添加數(shù)據(jù)到Edits中,會(huì)導(dǎo)致該文件數(shù)據(jù)過大,效率降低,而且一旦斷電,恢復(fù)元數(shù)據(jù)需要的時(shí)間過長。因此,需要定期進(jìn)行FsImage和Edits的合并,如果這個(gè)操作由NameNode節(jié)點(diǎn)完成,又會(huì)效率過低。因此,引入一個(gè)新的節(jié)點(diǎn)SecondaryNamenode,專門用于FsImage和Edits的合并。
1)第一階段:NameNode啟動(dòng)
(1)第一次啟動(dòng)NameNode格式化后,創(chuàng)建Fsimage和Edits文件。如果不是第一次啟動(dòng),直接加載編輯日志和鏡像文件到內(nèi)存。
(2)客戶端對(duì)元數(shù)據(jù)進(jìn)行增刪改的請(qǐng)求。
(3)NameNode記錄操作日志,更新滾動(dòng)日志。
(4)NameNode在內(nèi)存中對(duì)元數(shù)據(jù)進(jìn)行增刪改。
2)第二階段:Secondary NameNode工作
(1)Secondary NameNode詢問NameNode是否需要CheckPoint。直接帶回NameNode是否檢查結(jié)果。
(2)Secondary NameNode請(qǐng)求執(zhí)行CheckPoint。
(3)NameNode滾動(dòng)正在寫的Edits日志。
(4)將滾動(dòng)前的編輯日志和鏡像文件拷貝到Secondary NameNode。
(5)Secondary NameNode加載編輯日志和鏡像文件到內(nèi)存,并合并。
(6)生成新的鏡像文件fsimage.chkpoint。
(7)拷貝fsimage.chkpoint到NameNode。
(8)NameNode將fsimage.chkpoint重新命名成fsimage。
DataNode工作機(jī)制
(1)一個(gè)數(shù)據(jù)塊在DataNode上以文件形式存儲(chǔ)在磁盤上,包括兩個(gè)文件,一個(gè)是數(shù)據(jù)本身,一個(gè)是元數(shù)據(jù)包括數(shù)據(jù)塊的長度,塊數(shù)據(jù)的校驗(yàn)和,以及時(shí)間戳。
(2)DataNode啟動(dòng)后向NameNode注冊(cè),通過后,周期性(6小時(shí))的向NameNode上報(bào)所有的塊信息。
(3)心跳是每3秒一次,心跳返回結(jié)果帶有NameNode給該DataNode的命令如復(fù)制塊數(shù)據(jù)到另一臺(tái)機(jī)器,或刪除某個(gè)數(shù)據(jù)塊。如果超過10分鐘沒有收到某個(gè)DataNode的心跳,則認(rèn)為該節(jié)點(diǎn)不可用。
(4)集群運(yùn)行中可以安全加入和退出一些機(jī)器。
DataNode數(shù)據(jù)完整性如何保證
如下是DataNode節(jié)點(diǎn)保證數(shù)據(jù)完整性的方法。
(1)當(dāng)DataNode讀取Block的時(shí)候,它會(huì)計(jì)算CheckSum。
(2)如果計(jì)算后的CheckSum,與Block創(chuàng)建時(shí)值不一樣,說明Block已經(jīng)損壞。
(3)Client讀取其他DataNode上的Block。
(4)常見的校驗(yàn)算法crc(32),md5(128),sha1(160)
(5)DataNode在其文件創(chuàng)建后周期驗(yàn)證CheckSum。
柚子快報(bào)激活碼778899分享:Hadoop之HDFS概述
文章來源
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。