2、Hdfs架構(gòu)設(shè)計(jì)與原理詳解

@[TOC]

創(chuàng)新互聯(lián)建站基于成都重慶香港及美國等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動(dòng)大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)德陽機(jī)房托管報(bào)價(jià),主機(jī)托管價(jià)格性價(jià)比高,為金融證券行業(yè)服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專業(yè)成都idc公司。

1.Hadoop架構(gòu)

Hadoop由三個(gè)模塊組成:分布式存儲(chǔ)HDFS、分布式計(jì)算MapReduce、資源調(diào)度引擎Yarn

2.HDFS體系架構(gòu)

2.1NameNode

???NameNode負(fù)責(zé):文件元數(shù)據(jù)信息的操作以及處理客戶端的請(qǐng)求
???NameNode管理:HDFS文件系統(tǒng)的命名空間NameSpace。
???NameNode維護(hù):文件系統(tǒng)樹(FileSystem)以及文件樹中所有的文件和文件夾的元數(shù)據(jù)信息(matedata)維護(hù)文件到塊的對(duì)應(yīng)關(guān)系和塊到節(jié)點(diǎn)的對(duì)應(yīng)關(guān)系
???NameNode文件:namespace鏡像文件(fsimage),操作日志文件(edit log)這些信息被Cache在RAM中,當(dāng)然這兩個(gè)文件也會(huì)被持久化存儲(chǔ)在本地硬盤。
???NameNode記錄:每個(gè)文件中各個(gè)塊所在的數(shù)據(jù)節(jié)點(diǎn)的位置信息。但它并不永久保存塊的位置信息,因?yàn)檫@些信息在系統(tǒng)啟動(dòng)時(shí)由數(shù)據(jù)節(jié)點(diǎn)重建。從數(shù)據(jù)節(jié)點(diǎn)重建:在nameNode啟動(dòng)時(shí),DataNode向NameNode進(jìn)行注冊(cè)時(shí)發(fā)送給NameNode

2.1.1元數(shù)據(jù)信息

???文件名,文件目錄結(jié)構(gòu),文件屬性(生成時(shí)間,副本數(shù),權(quán)限)每個(gè)文件的塊列表。
以及列表中的塊與塊所在的DataNode之間的地址映射關(guān)系 在內(nèi)存中加載文件系統(tǒng)中每個(gè)文件和每個(gè)數(shù)據(jù)塊的引用關(guān)系(文件、block、datanode之間的映射信息) 數(shù)據(jù)會(huì)定期保存到本地磁盤,但不保存block的位置信息而是由DataNode注冊(cè)時(shí)上報(bào)和在運(yùn)行時(shí)維護(hù)

2.1.2NameNode文件操作

NameNode負(fù)責(zé)文件元數(shù)據(jù)的操作 ,DataNode負(fù)責(zé)處理文件內(nèi)容的讀寫請(qǐng)求,數(shù)據(jù)流不經(jīng)過NameNode,會(huì)詢問它跟那個(gè)DataNode聯(lián)系

2.1.3NameNode副本

文件數(shù)據(jù)塊到底存放到哪些DataNode上,是由NameNode決定的,NN根據(jù)全局情況做出放置副本的決定
讀取文件的時(shí)候,NN盡量讓client讀取離它最近的datanode上的副本,降低帶寬消耗和讀取時(shí)延

2.1.4NameNode心跳機(jī)制

全權(quán)管理數(shù)據(jù)塊的復(fù)制,周期性的接受心跳和塊的狀態(tài)報(bào)告信息(包含該DataNode上所有數(shù)據(jù)塊的列表)
若接受到心跳信息,NN認(rèn)為DN工作正常,如果在10分鐘后還接受到不到DN的心跳,那么NN認(rèn)為DN已經(jīng)宕機(jī) 這時(shí)候NN準(zhǔn)備要把DN上的數(shù)據(jù)塊進(jìn)行重新的復(fù)制。 塊的狀態(tài)報(bào)告包含了一個(gè)DN上所有數(shù)據(jù)塊的列表,blocks report 每個(gè)1小時(shí)發(fā)送一次

2.1.5NameNode容錯(cuò)機(jī)制

????沒有Namenode,HDFS就不能工作。事實(shí)上,如果運(yùn)行namenode的機(jī)器壞掉的話,系統(tǒng)中的文件將會(huì)完全丟失,因?yàn)闆]有其他方法能夠?qū)⑽挥诓煌琩atanode上的文件塊(blocks)重建文件。因此,namenode的容錯(cuò)機(jī)制非常重要,Hadoop提供了兩種機(jī)制。
????第一種方式是將持久化存儲(chǔ)在本地硬盤的文件系統(tǒng)元數(shù)據(jù)備份。Hadoop可以通過配置來讓Namenode將他的持久化狀態(tài)文件寫到不同的文件系統(tǒng)中。這種寫操作是同步并且是原子化的。比較常見的配置是在將持久化狀態(tài)寫到本地硬盤的同時(shí),也寫入到一個(gè)遠(yuǎn)程掛載的網(wǎng)絡(luò)文件系統(tǒng)(NFS)。
????第二種方式是運(yùn)行一個(gè)輔助的Namenode(SecondaryNamenode)。 事實(shí)上SecondaryNamenode并不能被用作Namenode它的主要作用是定期的將Namespace鏡像與操作日志文件(edit log)合并,以防止操作日志文件(edit log)變得過大。通常,SecondaryNamenode 運(yùn)行在一個(gè)單獨(dú)的物理機(jī)上,因?yàn)楹喜⒉僮餍枰加么罅康腃PU時(shí)間以及和Namenode相當(dāng)?shù)膬?nèi)存。輔助Namenode保存著合并后的Namespace鏡像的一個(gè)備份,萬一哪天Namenode宕機(jī)了,這個(gè)備份就可以用上了。
????但是輔助Namenode總是落后于主Namenode,所以在Namenode宕機(jī)時(shí),數(shù)據(jù)丟失是不可避免的。在這種情況下,一般的,要結(jié)合第一種方式中提到的遠(yuǎn)程掛載的網(wǎng)絡(luò)文件系統(tǒng)(NFS)中的Namenode的元數(shù)據(jù)文件來使用,把NFS中的Namenode元數(shù)據(jù)文件,拷貝到輔助Namenode,并把輔助Namenode作為主Namenode來運(yùn)行。

2.1.6NameNode物理結(jié)構(gòu)

2、Hdfs架構(gòu)設(shè)計(jì)與原理詳解
2、Hdfs架構(gòu)設(shè)計(jì)與原理詳解
2、Hdfs架構(gòu)設(shè)計(jì)與原理詳解

2.1.7NameNode文件結(jié)構(gòu)

2、Hdfs架構(gòu)設(shè)計(jì)與原理詳解
NameNode的存儲(chǔ)目錄
2、Hdfs架構(gòu)設(shè)計(jì)與原理詳解

2.2DataNode

????一個(gè)集群可能包含上千個(gè)DataNode節(jié)點(diǎn),這些DataNode定時(shí)和NameNode進(jìn)行通信,接受NameNode的指令 為了減輕NameNode的負(fù)擔(dān),NameNode上并不永久保存哪個(gè)DataNode上有哪些數(shù)據(jù)塊的信息,而是通過DataNode啟動(dòng)時(shí)的上報(bào)來更新NameNode上的映射表。
????根據(jù)客戶端或者是namenode的調(diào)度存儲(chǔ)和檢索數(shù)據(jù),并且定期向namenode發(fā)送所存儲(chǔ)的塊(block)的列表,數(shù)據(jù)塊在DataNode進(jìn)程所在的節(jié)點(diǎn)上以文件的形式存儲(chǔ)在本地磁盤上 ,一個(gè)是數(shù)據(jù)本身 ,一個(gè)是元數(shù)據(jù)(數(shù)據(jù)塊的長度,塊數(shù)據(jù)的校驗(yàn)和,以及時(shí)間戳),維護(hù)blockid與DataNode之間的映射信息(元信息)

2.2.1DataNode工作機(jī)制

????datanode啟動(dòng)時(shí),每個(gè)datanode對(duì)本地磁盤進(jìn)行掃描,將本datanode上保存的block信息匯報(bào)給namenode namenode在接收到的block信息以及該block所在的datanode信息等保存在內(nèi)存中。
DataNode啟動(dòng)后向NameNode注冊(cè),通過后周期性(1小時(shí))的向NameNode上報(bào)所有的塊信息.
????(1)通過向NameNode發(fā)送心跳保持與其聯(lián)系(3秒一次),心跳返回結(jié)果帶有NN的命令 ,返回的命令為:如塊的復(fù)制,刪除某個(gè)數(shù)據(jù)塊…..
????(2)如果10分鐘沒有收到DataNode的心跳,則認(rèn)為其已經(jīng)lost,并copy其上的block到其它DataNode
????(3)DN在其文件創(chuàng)建后三周進(jìn)行驗(yàn)證其checkSum的值是否和文件創(chuàng)建時(shí)的checkSum值一致

2.2.2DataNode讀寫操作

????集群中的每個(gè)服務(wù)器都運(yùn)行一個(gè)DataNode后臺(tái)程序,這個(gè)后臺(tái)程序負(fù)責(zé)把HDFS數(shù)據(jù)塊讀寫到本地的文件系統(tǒng)。 當(dāng)需要通過客戶端讀/寫某個(gè)數(shù)據(jù)時(shí),先由NameNode告訴客戶端去哪個(gè)DataNode進(jìn)行具體的讀/寫操作 然后,客戶端直接與這個(gè)DataNode服務(wù)器上的后臺(tái)程序進(jìn)行通信,并且對(duì)相關(guān)的數(shù)據(jù)塊進(jìn)行讀/寫操作。

2.3SecondaryNameNode

????SecondaryNameNode是HDFS架構(gòu)中的一個(gè)組成部分,但是經(jīng)常由于名字而被人誤解它真正的用途,其實(shí)它真正的用途,是用來保存namenode中對(duì)HDFS metadata的信息的備份,并減少namenode重啟的時(shí)間。對(duì)于hadoop進(jìn)程中,要配置好并正確的使用snn,還是需要做一些工作的。hadoop的默認(rèn)配置中讓snn進(jìn)程默認(rèn)運(yùn)行在了namenode的那臺(tái)機(jī)器上,但是這樣的話,如果這臺(tái)機(jī)器出錯(cuò),宕機(jī),對(duì)恢復(fù)HDFS文件系統(tǒng)是很大的災(zāi)難,更好的方式是:將snn的進(jìn)程配置在另外一臺(tái)機(jī)器上運(yùn)行。
????在hadoop中,namenode負(fù)責(zé)對(duì)HDFS的metadata的持久化存儲(chǔ),并且處理來自客戶端的對(duì)HDFS的各種操作的交互反饋。為了保證交互速度,HDFS文件系統(tǒng)的metadata是被load到namenode機(jī)器的內(nèi)存中的,并且會(huì)將內(nèi)存中的這些數(shù)據(jù)保存到磁盤進(jìn)行持久化存儲(chǔ)。為了保證這個(gè)持久化過程不會(huì)成為HDFS操作的瓶頸,hadoop采取的方式是:沒有對(duì)任何一次的當(dāng)前文件系統(tǒng)的snapshot進(jìn)行持久化,對(duì)HDFS最近一段時(shí)間的操作list會(huì)被保存到namenode中的一個(gè)叫Editlog的文件中去。當(dāng)重啟namenode時(shí),除了load fslmage意外,還會(huì)對(duì)這個(gè)Editlog文件中記錄的HDFS操作進(jìn)行replay,以恢復(fù)HDFS重啟之前的最終狀態(tài)。
????而SecondaryNameNode,會(huì)周期性的將Editlog中記錄的對(duì)HDFS的操作合并到一個(gè)checkpoint中,然后清空Editlog。所以namenode的重啟就會(huì)Load最新的一個(gè)checkpoint,并重現(xiàn)Editlog中記錄的hdfs操作,由于Editlog中記錄的是從上一次checkpoint以后到現(xiàn)在的操作列表,所以就會(huì)比較小。如果沒有SecondaryNameNode的這個(gè)周期性的合并過程,那么當(dāng)每次重啟namenode的時(shí)候,就會(huì)花費(fèi)很長的時(shí)間。而這樣周期性的合并就能減少重啟的時(shí)間。同時(shí)也能保證HDFS系統(tǒng)的完整性。
????這就是SecondaryNameNode所做的事情。所以snn并不能分擔(dān)namenode上對(duì)HDFS交互性操作的壓力。盡管如此,當(dāng)namenode機(jī)器宕機(jī)或者namenode進(jìn)程出問題時(shí),namenode的daemon進(jìn)程可以通過人工的方式從snn上拷貝一份metadata來恢復(fù)HDFS文件系統(tǒng)。
至于為什么要將snn進(jìn)程運(yùn)行在一臺(tái)非NameNode的機(jī)器上,這主要出于兩點(diǎn)考慮:
????1、可擴(kuò)展性:創(chuàng)建一個(gè)新的HDFS的snapshot(快照)需要將namenode中l(wèi)oad到內(nèi)存的metadata信息全部拷貝一遍,這樣的操作需要的內(nèi)存和namenode占用的內(nèi)存一樣,由于分配給namenode進(jìn)程的內(nèi)存其實(shí)是對(duì)HDFS文件系統(tǒng)的限制,如果分布式文件系統(tǒng)非常的大,那么namenode那臺(tái)機(jī)器的內(nèi)存就可能會(huì)被namenode進(jìn)程全部占據(jù)。
????2、容錯(cuò)性:當(dāng)snn創(chuàng)建一個(gè)checkpoint的時(shí)候,它會(huì)將checkpoint拷貝成metadata的幾個(gè)拷貝。將這個(gè)操作運(yùn)行到另外一臺(tái)機(jī)器,還可以提供分布式文件系統(tǒng)的容錯(cuò)性。
SECONDARYNAMENODE工作原理

2.3.1SecondaryNameNode日志與鏡像合并步驟

日志與鏡像的定期合并總共分五步:
????1、SecondaryNameNode通知NameNode準(zhǔn)備提交edits文件,此時(shí)主節(jié)點(diǎn)產(chǎn)生edits.new
????2、SecondaryNameNode通過http get方式獲取NameNode的fsimage與edits文件(在SecondaryNameNode的current同級(jí)目錄下可見到 temp.check-point或者previous-checkpoint目錄,這些目錄中存儲(chǔ)著從namenode拷貝來的鏡像文件)
????3、SecondaryNameNode開始合并獲取的上述兩個(gè)文件,產(chǎn)生一個(gè)新的fsimage文件fsimage.ckpt
????4、SecondaryNameNode用http post方式發(fā)送fsimage.ckpt至NameNode
????5、NameNode將fsimage.ckpt與edits.new文件分別重命名為fsimage與edits,然后更新fstime,整個(gè)checkpoint過程到此結(jié)束。 在新版本的hadoop中(hadoop0.21.0),SecondaryNameNode兩個(gè)作用被兩個(gè)節(jié)點(diǎn)替換, checkpoint node與backup node. SecondaryNameNode備份由三個(gè)參數(shù)控制fs.checkpoint.period控制周期,fs.checkpoint.size控制日志文件超過多少大小時(shí)合并, dfs.http.address表示http地址,這個(gè)參數(shù)在SecondaryNameNode為單獨(dú)節(jié)點(diǎn)時(shí)需要設(shè)置。
2、Hdfs架構(gòu)設(shè)計(jì)與原理詳解

3.HDFS機(jī)制

3.1心跳機(jī)制

工作原理:

  1. master啟動(dòng)的時(shí)候,會(huì)開一個(gè)ipc server在那里。
  2. slave啟動(dòng),連接master,每隔3秒鐘向master發(fā)送一個(gè)“心跳”,攜帶狀態(tài)信息;
  3. master通過這個(gè)心跳的返回值,向slave節(jié)點(diǎn)傳達(dá)指令
    作用:
  4. Namenode全權(quán)管理數(shù)據(jù)塊的復(fù)制,它周期性地從集群中的每個(gè)Datanode接收心跳信號(hào)和塊狀態(tài)報(bào)告
    (Blockreport)。接收到心跳信號(hào)意味著該Datanode節(jié)點(diǎn)工作正常。塊狀態(tài)報(bào)告包含了一個(gè)該 Datanode上所
    有數(shù)據(jù)塊的列表
  5. DataNode啟動(dòng)后向NameNode注冊(cè),通過后,周期性(1小時(shí))的向 NameNode上報(bào)所有的塊的列表;
    每3秒向NamNode發(fā)一次心跳,返回NameNode給該DataNode的命令;如復(fù)制塊數(shù)據(jù)到另一臺(tái)機(jī)器,或刪
    除某個(gè)數(shù)據(jù)塊。如果NameNode超過10分鐘沒有收 到某個(gè)DataNode 的心跳,則認(rèn)為該節(jié)點(diǎn)不可用。
  6. hadoop集群剛開始啟動(dòng)時(shí),會(huì)進(jìn)入安全模式(99.9%),就用到了心跳機(jī)制

3.2負(fù)載均衡

????Hadoop的HDFS集群非常容易出現(xiàn)機(jī)器與機(jī)器之間磁盤利用率不平衡的情況,例如:當(dāng)集群內(nèi)新增、刪除節(jié)點(diǎn),或者某個(gè)節(jié)點(diǎn)機(jī)器內(nèi)硬盤存儲(chǔ)達(dá)到飽和值。當(dāng)數(shù)據(jù)不平衡時(shí),Map任務(wù)可能會(huì)分配到?jīng)]有存儲(chǔ)數(shù)據(jù)的機(jī)器,這將導(dǎo)致網(wǎng)絡(luò)帶寬的消耗,也無法很好的進(jìn)行本地計(jì)算。
當(dāng)HDFS負(fù)載不均衡時(shí),需要對(duì)HDFS進(jìn)行數(shù)據(jù)的負(fù)載均衡調(diào)整,即對(duì)各節(jié)點(diǎn)機(jī)器上數(shù)據(jù)的存儲(chǔ)分布進(jìn)行調(diào)整。從而,讓數(shù)據(jù)均勻的分布在各個(gè)DataNode上,均衡IO性能,防止熱點(diǎn)的發(fā)生。進(jìn)行數(shù)據(jù)的負(fù)載均衡調(diào)整,必須要滿足如下原則:
c(1)數(shù)據(jù)平衡不能導(dǎo)致數(shù)據(jù)塊減少,數(shù)據(jù)塊備份丟失
????(2)管理員可以中止數(shù)據(jù)平衡進(jìn)程
????(3)每次移動(dòng)的數(shù)據(jù)量以及占用的網(wǎng)絡(luò)資源,必須是可控的
????(4)數(shù)據(jù)均衡過程,不能影響namenode的正常工作
負(fù)載均衡原理如下:
2、Hdfs架構(gòu)設(shè)計(jì)與原理詳解
步驟分析如下:
????(1)數(shù)據(jù)均衡服務(wù)(Rebalancing Server)首先要求 NameNode 生成 DataNode 數(shù)據(jù)分布分析報(bào)告,獲取每個(gè)DataNode磁盤使用情況
????(2)Rebalancing Server匯總需要移動(dòng)的數(shù)據(jù)分布情況,計(jì)算具體數(shù)據(jù)塊遷移路線圖。數(shù)據(jù)塊遷移路線圖,確保網(wǎng)絡(luò)內(nèi)最短路徑
????(3)開始數(shù)據(jù)塊遷移任務(wù),Proxy Source Data Node復(fù)制一塊需要移動(dòng)數(shù)據(jù)塊
????(4)將復(fù)制的數(shù)據(jù)塊復(fù)制到目標(biāo)DataNode上
????(5)刪除原始數(shù)據(jù)塊
????(6)目標(biāo)DataNode向Proxy Source Data Node確認(rèn)該數(shù)據(jù)塊遷移完成
????(7)Proxy Source Data Node向Rebalancing Server確認(rèn)本次數(shù)據(jù)塊遷移完成。然后繼續(xù)執(zhí)行這個(gè)過程,直至集群達(dá)到數(shù)據(jù)均衡標(biāo)準(zhǔn)

4.HDFS讀寫流程

????在了解讀寫過程之前先了了解基本的概念:
????在DFSClient寫HDFS的過程中,有三個(gè)需要搞清楚的單位:block、packet與chunk;
????block是最大的一個(gè)單位,它是最終存儲(chǔ)于DataNode上的數(shù)據(jù)粒度,由dfs.block.size參數(shù)決定,默認(rèn)是64M;注:這個(gè)參數(shù)由客戶端配置決定;
????packet是中等的一個(gè)單位,它是數(shù)據(jù)由DFSClient流向DataNode的粒度,以dfs.write.packet.size參數(shù)為參考值,默認(rèn)是64K;注:這個(gè)參數(shù)為參考值,是指真正在進(jìn)行數(shù)據(jù)傳輸時(shí),會(huì)以它為基準(zhǔn)進(jìn)行調(diào)整,調(diào)整的原因是一個(gè)packet有特定的結(jié)構(gòu),調(diào)整的目標(biāo)是這個(gè)packet的大小剛好包含結(jié)構(gòu)中的所有成員,同時(shí)也保證寫到DataNode后當(dāng)前block的大小不超過設(shè)定值;
????chunk是最小的一個(gè)單位,它是DFSClient到DataNode數(shù)據(jù)傳輸中進(jìn)行數(shù)據(jù)校驗(yàn)的粒度,由io.bytes.per.checksum參數(shù)決定,默認(rèn)是512B;
????注:事實(shí)上一個(gè)chunk還包含4B的校驗(yàn)值,因而chunk寫入packet時(shí)是516B;數(shù)據(jù)與檢驗(yàn)值的比值為128:1,所以對(duì)于一個(gè)128M的block會(huì)有一個(gè)1M的校驗(yàn)文件與之對(duì)應(yīng);

4.1數(shù)據(jù)讀流程

2、Hdfs架構(gòu)設(shè)計(jì)與原理詳解
????1、客戶端調(diào)用FileSystem 實(shí)例的open 方法,獲得這個(gè)文件對(duì)應(yīng)的輸入流InputStream。
????2、通過RPC 遠(yuǎn)程調(diào)用NameNode ,獲得NameNode 中此文件對(duì)應(yīng)的數(shù)據(jù)塊保存位置,包括這個(gè)文件的副本的保存位置( 主要是各DataNode的地址) 。
????3、獲得輸入流之后,客戶端調(diào)用read 方法讀取數(shù)據(jù)。選擇最近的DataNode 建立連接并讀取數(shù)據(jù)。
????4、如果客戶端和其中一個(gè)DataNode 位于同一機(jī)器(比如MapReduce 過程中的mapper 和reducer),那么就會(huì)直接從本地讀取數(shù)據(jù)。
????5、到達(dá)數(shù)據(jù)塊末端,關(guān)閉與這個(gè)DataNode 的連接,然后重新查找下一個(gè)數(shù)據(jù)塊。
????6、不斷執(zhí)行第2 - 5 步直到數(shù)據(jù)全部讀完。
????7、客戶端調(diào)用close ,關(guān)閉輸入流DF S InputStream。
????在讀的過程中如何保證數(shù)據(jù)的完整性:
????通過校驗(yàn)和。因?yàn)槊總€(gè)chunk中都有一個(gè)校驗(yàn)位,一個(gè)個(gè)chunk構(gòu)成packet,一個(gè)個(gè)packet最終形成block,故可在block上求校驗(yàn)和。HDFS 的client端即實(shí)現(xiàn)了對(duì) HDFS 文件內(nèi)容的校驗(yàn)和 (checksum) 檢查。當(dāng)客戶端創(chuàng)建一個(gè)新的HDFS文件時(shí)候,分塊后會(huì)計(jì)算這個(gè)文件每個(gè)數(shù)據(jù)塊的校驗(yàn)和,此校驗(yàn)和會(huì)以一個(gè)隱藏文件形式保存在同一個(gè) HDFS 命名空間下。當(dāng)client端從HDFS中讀取文件內(nèi)容后,它會(huì)檢查分塊時(shí)候計(jì)算出的校驗(yàn)和(隱藏文件里)和讀取到的文件塊中校驗(yàn)和是否匹配,如果不匹配,客戶端可以選擇從其他 Datanode 獲取該數(shù)據(jù)塊的副本。

4.2數(shù)據(jù)寫流程

2、Hdfs架構(gòu)設(shè)計(jì)與原理詳解
2、Hdfs架構(gòu)設(shè)計(jì)與原理詳解
????1、使用 HDFS 提供的客戶端 Client,向遠(yuǎn)程的 namenode 發(fā)起 RPC 請(qǐng)求
????2、namenode 會(huì)檢查要?jiǎng)?chuàng)建的文件是否已經(jīng)存在,創(chuàng)建者是否有權(quán)限進(jìn)行操作,成功則會(huì) 為文件創(chuàng)建一個(gè)記錄,否則會(huì)讓客戶端拋出異常;
????3、當(dāng)客戶端開始寫入文件的時(shí)候,客戶端會(huì)將文件切分成多個(gè) packets,并在內(nèi)部以數(shù)據(jù)隊(duì)列“data queue(數(shù)據(jù)隊(duì)列)”的形式管理這些 packets,并向 namenode 申請(qǐng) blocks,獲 取用來存儲(chǔ) replicas 的合適的 datanode 列表,列表的大小根據(jù) namenode 中 replication 的設(shè)定而定;
????4、開始以 pipeline(管道)的形式將 packet 寫入所有的 replicas 中??蛻舳税?packet 以流的 方式寫入第一個(gè) datanode,該 datanode 把該 packet 存儲(chǔ)之后,再將其傳遞給在此 pipeline 中的下一個(gè) datanode,直到最后一個(gè) datanode,這種寫數(shù)據(jù)的方式呈流水線的形式。
????5、最后一個(gè) datanode 成功存儲(chǔ)之后會(huì)返回一個(gè) ack packet(確認(rèn)隊(duì)列),在 pipeline 里傳遞 至客戶端,在客戶端的開發(fā)庫內(nèi)部維護(hù)著"ack queue",成功收到 datanode 返回的 ack packet 后會(huì)從"data queue"移除相應(yīng)的 packet。
????6、如果傳輸過程中,有某個(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,保持 replicas 設(shè)定的 數(shù)量。
????7、客戶端完成數(shù)據(jù)的寫入后,會(huì)對(duì)數(shù)據(jù)流調(diào)用 close()方法,關(guān)閉數(shù)據(jù)流;
????8、只要寫入了 dfs.replication.min(最小寫入成功的副本數(shù))的復(fù)本數(shù)(默認(rèn)為 1),寫操作 就會(huì)成功,并且這個(gè)塊可以在集群中異步復(fù)制,直到達(dá)到其目標(biāo)復(fù)本數(shù)(dfs.replication 的默認(rèn)值為 3),因?yàn)?namenode 已經(jīng)知道文件由哪些塊組成,所以它在返回成功前只需 要等待數(shù)據(jù)塊進(jìn)行最小量的復(fù)制。

網(wǎng)頁標(biāo)題:2、Hdfs架構(gòu)設(shè)計(jì)與原理詳解
分享URL:http://muchs.cn/article16/ipgggg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、做網(wǎng)站、品牌網(wǎng)站制作、品牌網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)