摘要:為了保證元數(shù)據(jù)文件的高可用系統(tǒng),一般的做法,將設(shè)置成一逗號(hào)分隔的多個(gè)目錄,這個(gè)目錄至少不要在一塊磁盤(pán)上,最后在不同的機(jī)器上。
Hadoop
Hadoop由兩部分組成,分別是分布式文件系統(tǒng)(HDFS)和分布式計(jì)算框架MapReduce
HDFS架構(gòu)圖
負(fù)責(zé)文件元數(shù)據(jù)信息的操作以及客戶端的請(qǐng)求
管理HDFS文件系統(tǒng)的命名空間
維護(hù)文件樹(shù)中所有的文件和文件夾的元數(shù)據(jù)信息以及文件到快的對(duì)應(yīng)關(guān)系和塊到節(jié)點(diǎn)的對(duì)應(yīng)關(guān)系
單個(gè)NameNode支持4000臺(tái)DataNode集群
NameNode在內(nèi)存中保存著整個(gè)文件系統(tǒng)的名字空間和文件數(shù)據(jù)塊的地址映射
元數(shù)據(jù)文件名,文件目錄結(jié)構(gòu),文件創(chuàng)建時(shí)間,文件副本數(shù),文件權(quán)限,每個(gè)文件的block列表
fsimage:元數(shù)據(jù)鏡像文件,里面記錄了自最后一次檢查點(diǎn)之前HDFS文件系統(tǒng)中所有目錄和文件的序列化信息;
注意:Block的位置信息不會(huì)保存到fsimage,Block保存在哪個(gè)DataNode由DataNode啟動(dòng)時(shí)上報(bào)。
edits:操作日志文件,保存了自最后一次檢查點(diǎn)之后所有對(duì)HDFS文件的操作,比如:增加文件、重名名文件、刪除文件
在NameNode啟動(dòng)的時(shí)候,先將fsimage中的文件系統(tǒng)元數(shù)據(jù)信息加載到內(nèi)存,然后根據(jù)edits中的記錄將內(nèi)存中的元數(shù)據(jù)同步到最新?tīng)顟B(tài);所以,這兩個(gè)文件一旦損壞或丟失,將導(dǎo)致整個(gè)HDFS文件系統(tǒng)不可用。
為了保證元數(shù)據(jù)文件的高可用系統(tǒng),一般的做法,將dfs.namenode.name.dir設(shè)置成一逗號(hào)分隔的多個(gè)目錄,這個(gè)目錄至少不要在一塊磁盤(pán)上,最后在不同的機(jī)器上。
為了避免edits文件過(guò)大,SecondaryNameNode會(huì)按照時(shí)間閾值或者大小閾值,周期性的將fsimage和edits合并,然后將最新的fsimage推送給NameNode。
SecondaryNameNode鏡像備份
日志與鏡像的定期合并
DataNode處理文件內(nèi)容的讀寫(xiě)請(qǐng)求
一個(gè)數(shù)據(jù)快在DataNode以文件存儲(chǔ)在磁盤(pán)上,包括兩個(gè)文件,一個(gè)是數(shù)據(jù)本身,一個(gè)是元數(shù)據(jù),包括數(shù)據(jù)塊的長(zhǎng)度,塊數(shù)據(jù)的校驗(yàn)和,以及時(shí)間戳
DataNode啟動(dòng)后,周期性的向NameNode上報(bào)所有的塊信息。
每3秒保持一次心跳,如果超過(guò)10分鐘沒(méi)有收到某個(gè)DataNode的心跳,則認(rèn)為該節(jié)點(diǎn)不可用。
文件劃分成塊,默認(rèn)大小128M,以快為單位,每個(gè)快有多個(gè)副本(默認(rèn)3個(gè))存儲(chǔ)不同的機(jī)器上。
BlockBlock數(shù)據(jù)塊是HDFS文件系統(tǒng)基本的存儲(chǔ)單位
小于一個(gè)快的文件,不會(huì)占據(jù)整個(gè)快的空間
使用Block有利于容災(zāi)備份
Hadoop1.x 默認(rèn)64M,Hadoop2.X默認(rèn)128M
Block數(shù)據(jù)塊大小設(shè)置較大的原因:
減少文件尋址時(shí)間
減少管理快的數(shù)據(jù)開(kāi)銷,因每個(gè)快都需要在NameNode上有對(duì)應(yīng)的記錄
對(duì)數(shù)據(jù)快進(jìn)行讀寫(xiě),減少建立網(wǎng)絡(luò)的連接成本
優(yōu)點(diǎn)
一個(gè)文件的大小可以大于網(wǎng)絡(luò)中任意一個(gè)磁盤(pán)的容量
使用抽象塊而非整個(gè)文件作為存儲(chǔ)單元,大大簡(jiǎn)化了存儲(chǔ)子系統(tǒng)的設(shè)計(jì)
塊還非常適合用于數(shù)據(jù)備份進(jìn)而提供數(shù)據(jù)容錯(cuò)能力和提高可用性
合并流程將hdfs更新記錄寫(xiě)入一個(gè)新的文件--edits.new
將fsimage和edits文件通過(guò)http協(xié)議發(fā)送至secondary namenode
將fsimage和edits合并,生成一個(gè)新的文件fsimage.ckpt。
將生成的fsimage.ckpt文件通過(guò)http協(xié)議發(fā)送至NameNode
重命名fsimage.ckpt為fsimage,edits.new為edits
讀流程客戶端通過(guò)調(diào)用FileSystem對(duì)象中的open()方法來(lái)讀取需要的數(shù)據(jù)
DistributedFileSystem會(huì)通過(guò)RPC協(xié)議調(diào)用NameNode來(lái)確定請(qǐng)求文件塊所在的位置
NameNode只會(huì)返回所調(diào)用文件中開(kāi)始的幾個(gè)塊而不是全部返回。對(duì)于每個(gè)返回的塊,都包含塊所在的DataNode的地址。隨后,這些返回的DataNode會(huì)按照Hadoop集群的拓?fù)浣Y(jié)構(gòu)得出客戶端的距離,然后在進(jìn)行排序。如果客戶端本身就是DataNode,那么它就從本地讀取文件。其次,DistributedFileSystem會(huì)向客戶端返回一個(gè)支持定位的輸入流對(duì)象FSDataInputStream,用于給客戶端讀取數(shù)據(jù)。FSDataInputStream包含一個(gè)DFSInputStream對(duì)象,這個(gè)對(duì)象來(lái)管理DataNode和NameNode之間的IO
當(dāng)以上步驟完成時(shí),客戶端便會(huì)在這個(gè)輸入流上調(diào)用read()方法
DFSInputStream對(duì)象中包含文件開(kāi)始部分?jǐn)?shù)據(jù)塊所在的DataNode地址,首先它會(huì)連接文件第一個(gè)塊最近的DataNode,隨后在數(shù)據(jù)流中重復(fù)調(diào)用read方法,直到這個(gè)塊讀完為止。
當(dāng)?shù)谝粋€(gè)塊讀取完畢時(shí),DFSInputStream會(huì)關(guān)閉連接,并查找存儲(chǔ)下一個(gè)數(shù)據(jù)塊距離客戶端最近的DataNode,以上這些步驟對(duì)客戶端來(lái)說(shuō)都是透明的。
客戶端按照DFSInputStream打開(kāi)和DataNode連接返回的數(shù)據(jù)流的順序讀取該塊,它也會(huì)調(diào)用NameNode來(lái)檢查下一組塊所在的DataNode位置信息。當(dāng)完成所有塊的讀取時(shí),客戶端則會(huì)在DFSInputStream中調(diào)用close()方法。
寫(xiě)流程客戶端發(fā)送請(qǐng)求,調(diào)用DistributedFileSystem API的create方法去請(qǐng)求namenode,并告訴namenode上傳文件的文件名、文件大小、文件擁有者。
namenode根據(jù)以上信息算出文件需要切成多少塊block,以及block要存放在哪個(gè)datanode上,并將這些信息返回給客戶端。
客戶端調(diào)用FSDataInputStream API的write方法首先將其中一個(gè)block寫(xiě)在datanode上,每一個(gè)block默認(rèn)都有3個(gè)副本,并不是由客戶端分別往3個(gè)datanode上寫(xiě)3份,而是由
已經(jīng)上傳了block的datanode產(chǎn)生新的線程,由這個(gè)namenode按照放置副本規(guī)則往其它datanode寫(xiě)副本,這樣的優(yōu)勢(shì)就是快。
寫(xiě)完后返回給客戶端一個(gè)信息,然后客戶端在將信息反饋給namenode。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/71563.html
摘要:說(shuō)明本文所有操作均在環(huán)境下進(jìn)行。任何可以使用來(lái)編寫(xiě)的應(yīng)用,最終會(huì)由編寫(xiě)。書(shū)中分別介紹了如何使用和結(jié)合進(jìn)行開(kāi)發(fā)。工具會(huì)創(chuàng)建作業(yè),發(fā)送給各個(gè),同時(shí)監(jiān)控整個(gè)作業(yè)的執(zhí)行過(guò)程。準(zhǔn)備好的運(yùn)行環(huán)境之后開(kāi)始搭建的運(yùn)行環(huán)境,參考單節(jié)點(diǎn)集群配置。 說(shuō)明 本文所有操作均在 linux 環(huán)境下進(jìn)行。 轉(zhuǎn)載請(qǐng)注明出處。 任何可以使用JavaScript來(lái)編寫(xiě)的應(yīng)用,最終會(huì)由JavaScript編寫(xiě)。 作為...
閱讀 1502·2021-11-22 09:34
閱讀 1452·2021-09-22 14:57
閱讀 3507·2021-09-10 10:50
閱讀 1544·2019-08-30 15:54
閱讀 3746·2019-08-29 17:02
閱讀 3528·2019-08-29 12:54
閱讀 2684·2019-08-27 10:57
閱讀 3378·2019-08-26 12:24