HDFS技術(shù)原理
不點(diǎn)藍(lán)字,我們哪來(lái)故事?

每天 11 點(diǎn)更新文章,餓了點(diǎn)外賣(mài),點(diǎn)擊 ??《無(wú)門(mén)檻外賣(mài)優(yōu)惠券,每天免費(fèi)領(lǐng)!》

HDFS概述:
HDFS(Hadoop Distributed File System)基于Google發(fā)布的GFS論文設(shè)計(jì)開(kāi)發(fā),運(yùn)行在通用硬件平臺(tái)上的分布式文件系統(tǒng)。
其除具有其他分布式文件系統(tǒng)的相同特性外,還有自己特有的特性:
高容錯(cuò)性:認(rèn)為硬件總是不可靠的。 高吞吐量:為大量數(shù)據(jù)訪(fǎng)問(wèn)的應(yīng)用提供高可用吞吐量支持。 大文件存儲(chǔ):支持存儲(chǔ)TB-PB級(jí)別的數(shù)據(jù)。
HDFS適合做:大文件存儲(chǔ)、流式數(shù)據(jù)訪(fǎng)問(wèn)。
HDFS不適合做:大量小文件、隨機(jī)寫(xiě)入、低延遲讀取。
HDFS應(yīng)用場(chǎng)景舉例:
HDFS是Hadoop技術(shù)框架中的分布式文件系統(tǒng),對(duì)部署在多臺(tái)獨(dú)立物理機(jī)器上的文件進(jìn)行管理。
可應(yīng)用與以下幾種場(chǎng)景:
網(wǎng)站用戶(hù)行為數(shù)據(jù)存儲(chǔ)。 生態(tài)系統(tǒng)數(shù)據(jù)存儲(chǔ)。 氣象數(shù)據(jù)存儲(chǔ)。
HDFS在FusionInsight產(chǎn)品的位置:
圖:HDFS在FusionInsight產(chǎn)品中的位置
FusionInsight HD 提供大數(shù)據(jù)處理環(huán)境,基于社區(qū)開(kāi)源軟件增強(qiáng),按照?qǐng)鼍斑x擇業(yè)界最佳實(shí)踐。
HDFS作為Hadoop的基礎(chǔ)存儲(chǔ)設(shè)施,實(shí)現(xiàn)了一個(gè)分布式、高容錯(cuò)、可線(xiàn)性擴(kuò)展的文件系統(tǒng)。
HDFS系統(tǒng)架構(gòu)
系統(tǒng)設(shè)計(jì)目標(biāo):
(1)硬件失效:
硬件的異常比軟件的異常更加常見(jiàn)。 對(duì)于有上百臺(tái)服務(wù)器的數(shù)據(jù)中心來(lái)說(shuō),認(rèn)為總有服務(wù)器異常,硬件異常是常態(tài)。 HDFS需要監(jiān)測(cè)這些異常,并自動(dòng)恢復(fù)數(shù)據(jù)。
(2)流式數(shù)據(jù)訪(fǎng)問(wèn):
基于HDFS的應(yīng)用僅采用流式方式讀數(shù)據(jù)。 運(yùn)行在HDFS上的應(yīng)用并非以通用業(yè)務(wù)為目的的應(yīng)用程序。 應(yīng)用程序關(guān)注的是吞吐量,而非響應(yīng)時(shí)間。 非POSIX標(biāo)準(zhǔn)接口的數(shù)據(jù)訪(fǎng)問(wèn)。
(3)存儲(chǔ)數(shù)據(jù)大:
運(yùn)行在HDFS的應(yīng)用程序有較大的數(shù)據(jù)需要處理。 典型的文件大小為GP到TB級(jí)別。
(4)數(shù)據(jù)一致性:
應(yīng)用程序采用WORM(Write Once Read Many)的數(shù)據(jù)讀寫(xiě)模型。 文件僅支持追加,而不允許修改。
(5)多硬件平臺(tái):
HDFS可運(yùn)行在不同的硬件平臺(tái)上。
(6)移動(dòng)計(jì)算能力:
計(jì)算和存儲(chǔ)能力采用就近原則,計(jì)算離數(shù)據(jù)最近。 就近原則將有效減少網(wǎng)絡(luò)的負(fù)載,降低網(wǎng)絡(luò)擁塞。
基本系統(tǒng)架構(gòu):
圖:HDFS系統(tǒng)架構(gòu)圖
HDFS架構(gòu)包含三個(gè)部分:(NameNode,DateNode,Client)
NameDode:用于存儲(chǔ)、生成文件系統(tǒng)的元數(shù)據(jù)、運(yùn)行一個(gè)實(shí)例。 DateNode:用于存儲(chǔ)實(shí)際的數(shù)據(jù),將自己管理的數(shù)據(jù)塊上報(bào)給NameNode,運(yùn)行多個(gè)實(shí)例。 Client:支持業(yè)務(wù)訪(fǎng)問(wèn)HDFS,從NameNode,DateNode獲取數(shù)據(jù)返回給業(yè)務(wù)。多個(gè)實(shí)例,和業(yè)務(wù)一起運(yùn)行。
HDFS數(shù)據(jù)寫(xiě)入流程:
圖:HDFS數(shù)據(jù)寫(xiě)入流程圖
HDFS數(shù)據(jù)寫(xiě)入流程如下:
業(yè)務(wù)應(yīng)用調(diào)用HDFS Client提供的API創(chuàng)建文件,請(qǐng)求寫(xiě)入。 HDFS Client聯(lián)系NameNode,NameNode在元數(shù)據(jù)中創(chuàng)建文件節(jié)點(diǎn)。 業(yè)務(wù)應(yīng)用調(diào)用write API寫(xiě)入文件。 HDFS Client收到業(yè)務(wù)數(shù)據(jù)后,從NameNode獲取到數(shù)據(jù)塊編號(hào)、位置信息后,聯(lián)系DateNode,并將要寫(xiě)入數(shù)據(jù)的DateNode建立起流水線(xiàn)。完成后,客戶(hù)端再通過(guò)自有協(xié)議寫(xiě)入數(shù)據(jù)到DateNode1,再由DateNode1復(fù)制到NateNode2,DateNode3. 寫(xiě)完的數(shù)據(jù),將返回確認(rèn)信息給HDFS Client。 所有數(shù)據(jù)確認(rèn)完成后,業(yè)務(wù)調(diào)用HDFS CLient關(guān)閉文件。 業(yè)務(wù)調(diào)用close,flush后HDFS Client聯(lián)系NameNode,確認(rèn)數(shù)據(jù)寫(xiě)完成,NameNode持久化元數(shù)據(jù)。
HDFS數(shù)據(jù)讀取流程:
圖:HDFS數(shù)據(jù)讀取流程圖
HDFS數(shù)據(jù)讀取流程如下:
業(yè)務(wù)調(diào)用HDFS Client提供的API打開(kāi)文件。 HDFS Client 聯(lián)系 NmaeNode,獲取到文件信息(數(shù)據(jù)塊、DateNode位置信息)。 業(yè)務(wù)應(yīng)用調(diào)用read API讀取文件。 HDFS Client根據(jù)從NmaeNode獲取到的信息,聯(lián)系DateNode,獲取相應(yīng)的數(shù)據(jù)塊。(Client采用就近原則讀取數(shù)據(jù))。 HDFS Client會(huì)與多個(gè)DateNode通訊獲取數(shù)據(jù)塊。 數(shù)據(jù)讀取完成后,業(yè)務(wù)調(diào)用close關(guān)閉連接。
HDFS關(guān)鍵特性介紹
HDFS架構(gòu)關(guān)鍵設(shè)計(jì):
圖:HDFS架構(gòu)關(guān)鍵設(shè)計(jì)
元數(shù)據(jù)持久化:
元數(shù)據(jù)持久haul
圖:元數(shù)據(jù)持久化流程圖
元數(shù)據(jù)持久化流程如下:
備N(xiāo)maeNode通知主NameNode生成新的日志文件,以后的日志寫(xiě)到Editlog.new中,并獲取舊的Editlog。 備N(xiāo)ameNode從注NameNode上獲取FSImage文件及位于JournalNode上面的舊Editlog。 備N(xiāo)maeNode將日志和舊的元數(shù)據(jù)合并,生成新的元數(shù)據(jù)FSImage.ckpt。 備N(xiāo)ameNode將元數(shù)據(jù)上傳到主NameNode。 主NameNode將上傳的原書(shū)記進(jìn)行回滾。 循環(huán)步驟1.
元數(shù)據(jù)持久化健壯機(jī)制:
HDFS主要目的是保證存儲(chǔ)數(shù)據(jù)完整性,對(duì)于各組件的失效,做了可靠性處理。
重建失效數(shù)據(jù)盤(pán)的副本數(shù)據(jù)
DateNode向NmaeNode周期上報(bào)失敗時(shí),NmaeNode發(fā)起副本重建動(dòng)作以恢復(fù)丟失副本。
集群數(shù)據(jù)均衡
HDFS架構(gòu)設(shè)計(jì)了數(shù)據(jù)均衡機(jī)制,此機(jī)制保證數(shù)據(jù)在各個(gè)DateNode上分布式平均的。
數(shù)據(jù)有效性保證
DateNode數(shù)據(jù)在讀取時(shí)校驗(yàn)失敗,則從其他數(shù)據(jù)節(jié)點(diǎn)讀取數(shù)據(jù)。
元數(shù)據(jù)可靠性保證
采用日志機(jī)制操作元數(shù)據(jù),同時(shí)元數(shù)據(jù)存放在主備N(xiāo)ameNode上。
快照機(jī)制實(shí)現(xiàn)了文件系統(tǒng)常見(jiàn)的快照機(jī)制,保證數(shù)據(jù)誤操作時(shí),能及時(shí)恢復(fù)。
安全模式
HDFS提供獨(dú)有的安全模式機(jī)制,在數(shù)據(jù)節(jié)點(diǎn)故障時(shí),能防止故障擴(kuò)散。
HDFS高可靠性(HA):
HDFS高可靠性
圖;HDFS高可靠性原理
HA解決的是一個(gè)熱備份的問(wèn)題。
HDFS的高可靠性(HA)架構(gòu)在基本架構(gòu)上增加了一下組件:
ZooKeeper:分布式協(xié)調(diào),主要用來(lái)存儲(chǔ)HA下的狀態(tài)文件,主備信息、ZK個(gè)數(shù)建議3個(gè)及以上且為奇數(shù)個(gè)。 NmaeNode主備:NmaeNode主備模式,主提供服務(wù),備合并元數(shù)據(jù)并作為主的熱備。 ZKFC(Zookeeper Failover Controller)用于控制NmaeNode節(jié)點(diǎn)的主備狀態(tài)。 JN(JournalNode)日志節(jié)點(diǎn):用于共享存儲(chǔ)NmaeNode生成的Editlog。
HA
圖:HA原理
處于待命狀態(tài)的名稱(chēng)節(jié)點(diǎn)和處于活狀態(tài)的名稱(chēng)節(jié)點(diǎn),它們?cè)獢?shù)據(jù)的兩個(gè)方面的信息是怎么同步的:
處于待命狀態(tài)的名稱(chēng)節(jié)點(diǎn)當(dāng)中,它的兩方面元數(shù)據(jù),一個(gè)就是Editlog,它是通過(guò)共享存儲(chǔ)系統(tǒng)來(lái)獲得同步的,處于活躍狀態(tài)的名稱(chēng)節(jié)點(diǎn)已發(fā)生變化,馬上寫(xiě)入到共享存儲(chǔ)系統(tǒng),然后這共享存儲(chǔ)系統(tǒng)會(huì)通知待命的名稱(chēng)節(jié)點(diǎn)把它取走,這樣可以保證Editlog上兩者可以保持同步。對(duì)于映射表信息而言,也就是一個(gè)文件包含幾個(gè)塊,這些塊被保存到哪個(gè)數(shù)據(jù)節(jié)點(diǎn)上面。這種映射信息,它的 實(shí)時(shí)的維護(hù)是通過(guò)底層數(shù)據(jù)節(jié)點(diǎn),不斷同時(shí)向活躍名稱(chēng)節(jié)點(diǎn)和待命節(jié)點(diǎn)名稱(chēng)節(jié)點(diǎn)匯報(bào)來(lái)進(jìn)行維護(hù)的。這就是它的基本原理。
HDFS聯(lián)邦(Federation):
圖;HDFS聯(lián)邦
HDFS Federation主要能夠解決,單名稱(chēng)節(jié)點(diǎn)中存在的以下問(wèn)題:
HDFS集群的擴(kuò)展性問(wèn)題。
有了多個(gè)名稱(chēng)節(jié)點(diǎn),每個(gè)名稱(chēng)節(jié)點(diǎn)都可以各自的去管理一部分目錄。管理自己對(duì)應(yīng)的子命名空間的子目錄,這樣就可以讓一個(gè)集群擴(kuò)展到更多節(jié)點(diǎn)。
在HDFS1.0中會(huì)受到內(nèi)存的限制,制約文件存儲(chǔ)數(shù)目等限制。一個(gè)名稱(chēng)節(jié)點(diǎn)存儲(chǔ)的文件數(shù)目是有限的。
性能更高效
多個(gè)名稱(chēng)節(jié)點(diǎn)各自都管理它不同的數(shù)據(jù),而且可以同時(shí)對(duì)外服務(wù),所以可以提供更高的數(shù)據(jù)的吞吐率。
良好的隔離性
因?yàn)樗呀?jīng)根據(jù)不同業(yè)務(wù)數(shù)據(jù)要求,進(jìn)行了子空間的劃分,某種業(yè)務(wù)數(shù)據(jù)可能歸某個(gè)名稱(chēng)節(jié)點(diǎn)管理,另外一種業(yè)務(wù)數(shù)據(jù)屬于另外一個(gè)命名空間,歸另外一個(gè)名稱(chēng)節(jié)點(diǎn)管理。所以不同數(shù)據(jù)都分給不同名稱(chēng)節(jié)點(diǎn)去管理,這樣就可以有效地對(duì)不同應(yīng)用程序進(jìn)行隔離。不會(huì)導(dǎo)致一個(gè)應(yīng)用程序消耗過(guò)多資源,而影響另外一個(gè)應(yīng)用程序運(yùn)行的問(wèn)題。
HDFS不能解決單點(diǎn)故障問(wèn)題。
數(shù)據(jù)副本機(jī)制:
圖:數(shù)據(jù)副本機(jī)制
副本距離計(jì)算公式:
Distance(Rack1/D1,Rack1/D1)= 0 ,同一臺(tái)服務(wù)器的距離為0. Distance (Rack1/D1, Rack1/D3) = 2;同一機(jī)架不同的服務(wù)器距離為2. DIstance(Rack1/D1, Rack2/D1)= 4 ;不同機(jī)架的服務(wù)器距離為4.
副本放置策略:
第一個(gè)副本在本地機(jī)器。 第二個(gè)副本在遠(yuǎn)端機(jī)架的節(jié)點(diǎn)。 第三個(gè)副本看之前連個(gè)副本是否在同一機(jī)架,如果是則選擇其他機(jī)架,否則選擇和第一個(gè)副本相同機(jī)架的不同節(jié)點(diǎn)。 第四個(gè)及以上,隨機(jī)選擇副本存放位置。
配置HDFS數(shù)據(jù)存儲(chǔ)策略:
默認(rèn)情況下,HDFS NmaeNode自動(dòng)選擇DateNode保存數(shù)據(jù)的副本。在實(shí)際義務(wù)中,存在以下場(chǎng)景:
DateNode上存在的不同存儲(chǔ)設(shè)備,數(shù)據(jù)需要選擇一個(gè)合適的設(shè)備分級(jí)存儲(chǔ)數(shù)據(jù)。 DateNode不同目錄中的數(shù)據(jù)重要程度不同,數(shù)據(jù)需要根據(jù)目錄標(biāo)簽選擇一個(gè)格式的DateNode節(jié)點(diǎn)保存。 DateNode集群使用了異構(gòu)服務(wù)器,關(guān)鍵數(shù)據(jù)需要保存在具有高度可靠性的節(jié)點(diǎn)組中。
配置DateNode使用分級(jí)存儲(chǔ):
HDFS的分級(jí)存儲(chǔ)框架提供了RAM_DISK(內(nèi)存盤(pán))、DISK(機(jī)械硬盤(pán))、ARCHIVE(高密度低成本存儲(chǔ)介質(zhì))、SSD(固態(tài)硬盤(pán))四種存儲(chǔ)類(lèi)型的存儲(chǔ)設(shè)備。 通過(guò)對(duì)四種存儲(chǔ)類(lèi)型進(jìn)行合理組合,即可形成使用與不公場(chǎng)景的存儲(chǔ)策略。
配置標(biāo)簽存儲(chǔ)策略:
圖;標(biāo)簽存儲(chǔ)策略
配置DateNode使用標(biāo)簽存儲(chǔ):
用戶(hù)通過(guò)數(shù)據(jù)特征靈活配置HDFS數(shù)據(jù)塊存放策略,即為一個(gè)HDFS目錄設(shè)置一個(gè)標(biāo)簽表達(dá)式,每個(gè)DateNode可以對(duì)應(yīng)一個(gè)或多個(gè)標(biāo)簽;當(dāng)基于標(biāo)簽的數(shù)據(jù)塊存放策略為指定目錄下的文件選擇DateNode節(jié)點(diǎn)進(jìn)行存放時(shí),根據(jù)文件的標(biāo)簽表達(dá)式選擇出將要存放的DateNode節(jié)點(diǎn)范圍,然后在這個(gè)DateNode節(jié)點(diǎn)范圍內(nèi),遵守下一個(gè)指定的數(shù)據(jù)塊存放策略進(jìn)行存放。
配置DateNode使用節(jié)點(diǎn)組存儲(chǔ):
圖:節(jié)點(diǎn)組存儲(chǔ)
配置DateNode使用節(jié)點(diǎn)組存儲(chǔ):
關(guān)鍵數(shù)據(jù)根據(jù)實(shí)際業(yè)務(wù)需要保存在具有高度可靠性的節(jié)點(diǎn)中,此時(shí)DateNode組成了異構(gòu)集群。通過(guò)修改DateNode的存儲(chǔ)策略,系統(tǒng)可以將數(shù)據(jù)強(qiáng)制保存在指定的節(jié)點(diǎn)組中。
使用約束:
第一份副本將從強(qiáng)制機(jī)架組(機(jī)架組2)中選出,如果在強(qiáng)制機(jī)架組中沒(méi)用可用節(jié)點(diǎn),則寫(xiě)入失敗。 第二份副本將從本地客戶(hù)端機(jī)器或機(jī)架組中的隨機(jī)節(jié)點(diǎn)(當(dāng)客戶(hù)端機(jī)架組不為強(qiáng)制機(jī)架組時(shí))選出。 第三份副本將從其他機(jī)架組中選出。 各副本應(yīng)放在不同的機(jī)架組中。如果所需副本的數(shù)量大于可用的機(jī)架組數(shù)量,則會(huì)將多出的副本存放在隨機(jī)機(jī)架組中。
Colocation同分布:
同分布(Colocation)的定義:將存在關(guān)聯(lián)關(guān)系的數(shù)據(jù)或可能要進(jìn)行關(guān)聯(lián)操作的數(shù)據(jù)存儲(chǔ)在相同的存儲(chǔ)節(jié)點(diǎn)上。
按照下圖存放,假設(shè)要將文件A和文件D進(jìn)行關(guān)聯(lián)操作,此時(shí)不可避免地要進(jìn)行大量的數(shù)據(jù)搬遷,整個(gè)集群將由于數(shù)據(jù)傳輸占用大量網(wǎng)絡(luò)帶寬,嚴(yán)重影響大數(shù)據(jù)的處理速度與系統(tǒng)性能。
HDFS文件同分布的特性,將那些需要進(jìn)行關(guān)聯(lián)操作的文件存放在相同的數(shù)據(jù)節(jié)點(diǎn)上,在進(jìn)行關(guān)聯(lián)操作計(jì)算是避免了到其他數(shù)據(jù)節(jié)點(diǎn)上獲取數(shù)據(jù),大大降低了網(wǎng)絡(luò)帶寬的占用。
使用同分布特性,文件A、D進(jìn)行join時(shí),由于其對(duì)應(yīng)的block都在相同的節(jié)點(diǎn),因此大大降低了資源消耗。如下圖:
效果他
圖:Colocation同分布效果圖
HDFS架構(gòu)其他關(guān)鍵設(shè)計(jì)要點(diǎn)說(shuō)明:
統(tǒng)一的文件系統(tǒng):
HDFS對(duì)外僅呈現(xiàn)一個(gè)統(tǒng)一的文件系統(tǒng)。
統(tǒng)一的通訊協(xié)議:
統(tǒng)一采用RPC方式通信、NmaeNode被動(dòng)的接收Client,DateNode的RPC請(qǐng)求。
空間回收機(jī)制:
支持回收站機(jī)制,以及副本數(shù)的動(dòng)態(tài)設(shè)置機(jī)制。
數(shù)據(jù)組織:
數(shù)據(jù)存儲(chǔ)以數(shù)據(jù)塊為單位,存儲(chǔ)在操作系統(tǒng)的HDFS文件系統(tǒng)上。
訪(fǎng)問(wèn)方式:
提供Java API,http,shell方式訪(fǎng)問(wèn)HDFS數(shù)據(jù)。
常用的shell命令:
HDFS主要組件的功能
NameNode和DateNode的對(duì)比:
| NameNode | DateNode |
|---|---|
| 存儲(chǔ)文件內(nèi)容 | |
| 文件內(nèi)容保存在磁盤(pán) | |
| 保存文件,block,DateNode之間的映射關(guān)系 | 維護(hù)了block id到datenode本地文件的映射關(guān)系。 |
名稱(chēng)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu):
在HDFS中,名稱(chēng)節(jié)點(diǎn)(NameNode)負(fù)責(zé)管理分布式文件系統(tǒng)的命名空間(Namespace),保存了兩個(gè)核心的數(shù)據(jù)結(jié)構(gòu),即FsImage和EditLog
FsImage用于維護(hù)文件系統(tǒng)樹(shù)以及文件樹(shù)中所有的文件和文件夾的元數(shù)據(jù) 操作日志文件EditLog中記錄了所有針對(duì)文件的創(chuàng)建、刪除、重命名等操作 名稱(chēng)節(jié)點(diǎn)記錄了每個(gè)文件中各個(gè)塊所在的數(shù)據(jù)節(jié)點(diǎn)的位置信息
名稱(chēng)節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)
圖:名稱(chēng)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)
FsImage文件:
FsImage文件包含文件系統(tǒng)中所有目錄和文件inode的序列化形式。每個(gè)inode是一個(gè)文件或目錄的元數(shù)據(jù)的內(nèi)部表示,并包含此類(lèi)信息:文件的復(fù)制等級(jí)、修改和訪(fǎng)問(wèn)時(shí)間、訪(fǎng)問(wèn)權(quán)限、塊大小以及組成文件的塊。對(duì)于目錄,則存儲(chǔ)修改時(shí)間、權(quán)限和配額元數(shù)據(jù).
FsImage文件沒(méi)有記錄塊存儲(chǔ)在哪個(gè)數(shù)據(jù)節(jié)點(diǎn)。而是由名稱(chēng)節(jié)點(diǎn)把這些映射保留在內(nèi)存中,當(dāng)數(shù)據(jù)節(jié)點(diǎn)加入HDFS集群時(shí),數(shù)據(jù)節(jié)點(diǎn)會(huì)把自己所包含的塊列表告知給名稱(chēng)節(jié)點(diǎn),此后會(huì)定期執(zhí)行這種告知操作,以確保名稱(chēng)節(jié)點(diǎn)的塊映射是最新的。
名稱(chēng)節(jié)點(diǎn)的啟動(dòng):
在名稱(chēng)節(jié)點(diǎn)啟動(dòng)的時(shí)候,它會(huì)將FsImage文件中的內(nèi)容加載到內(nèi)存中,之后再執(zhí)行EditLog文件中的各項(xiàng)操作,使得內(nèi)存中的元數(shù)據(jù)和實(shí)際的同步,存在內(nèi)存中的元數(shù)據(jù)支持客戶(hù)端的讀操作。 一旦在內(nèi)存中成功建立文件系統(tǒng)元數(shù)據(jù)的映射,則創(chuàng)建一個(gè)新的FsImage文件和一個(gè)空的EditLog文件。 名稱(chēng)節(jié)點(diǎn)起來(lái)之后,HDFS中的更新操作會(huì)重新寫(xiě)到EditLog文件中,因?yàn)镕sImage文件一般都很大(GB級(jí)別的很常見(jiàn)),如果所有的更新操作都往FsImage文件中添加,這樣會(huì)導(dǎo)致系統(tǒng)運(yùn)行的十分緩慢,但是,如果往EditLog文件里面寫(xiě)就不會(huì)這樣,因?yàn)镋ditLog 要小很多。每次執(zhí)行寫(xiě)操作之后,且在向客戶(hù)端發(fā)送成功代碼之前,edits文件都需要同步更新。
名稱(chēng)節(jié)點(diǎn)運(yùn)行期間Editlog不斷變大的問(wèn)題:
在名稱(chēng)節(jié)點(diǎn)運(yùn)行期間,HDFS的所有更新操作都是直接寫(xiě)到EditLog中,久而久之, EditLog文件將會(huì)變得很大。 雖然這對(duì)名稱(chēng)節(jié)點(diǎn)運(yùn)行時(shí)候是沒(méi)有什么明顯影響的,但是,當(dāng)名稱(chēng)節(jié)點(diǎn)重啟的時(shí)候,名稱(chēng)節(jié)點(diǎn)需要先將FsImage里面的所有內(nèi)容映像到內(nèi)存中,然后再一條一條地執(zhí)行EditLog中的記錄,當(dāng)EditLog文件非常大的時(shí)候,會(huì)導(dǎo)致名稱(chēng)節(jié)點(diǎn)啟動(dòng)操作非常慢,而在這段時(shí)間內(nèi)HDFS系統(tǒng)處于安全模式,一直無(wú)法對(duì)外提供寫(xiě)操作,影響了用戶(hù)的使用。
如何解決?答案是:SecondaryNameNode第二名稱(chēng)節(jié)點(diǎn)
第二名稱(chēng)節(jié)點(diǎn)是HDFS架構(gòu)中的一個(gè)組成部分,它是用來(lái)保存名稱(chēng)節(jié)點(diǎn)中對(duì)HDFS 元數(shù)據(jù)信息的備份,并減少名稱(chēng)節(jié)點(diǎn)重啟的時(shí)間。SecondaryNameNode一般是單獨(dú)運(yùn)行在一臺(tái)機(jī)器上。
SecondaryNameNode的工作情況:
(1)SecondaryNameNode會(huì)定期和NameNode通信,請(qǐng)求其停止使用EditLog文件,暫時(shí)將新的寫(xiě)操作寫(xiě)到一個(gè)新的文件edit.new上來(lái),這個(gè)操作是瞬間完成,上層寫(xiě)日志的函數(shù)完全感覺(jué)不到差別;
(2)SecondaryNameNode通過(guò)HTTP GET方式從NameNode上獲取到FsImage和EditLog文件,并下載到本地的相應(yīng)目錄下;
(3)SecondaryNameNode將下載下來(lái)的FsImage載入到內(nèi)存,然后一條一條地執(zhí)行EditLog文件中的各項(xiàng)更新操作,使得內(nèi)存中的FsImage保持最新;這個(gè)過(guò)程就是EditLog和FsImage文件合并;
(4)SecondaryNameNode執(zhí)行完(3)操作之后,會(huì)通過(guò)post方式將新的FsImage文件發(fā)送到NameNode節(jié)點(diǎn)上 (5)NameNode將從SecondaryNameNode接收到的新的FsImage替換舊的FsImage文件,同時(shí)將edit.new替換EditLog文件,通過(guò)這個(gè)過(guò)程EditLog就變小了。
數(shù)據(jù)節(jié)點(diǎn):
數(shù)據(jù)節(jié)點(diǎn)是分布式文件系統(tǒng)HDFS的工作節(jié)點(diǎn),負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和讀取,會(huì)根據(jù)客戶(hù)端或者是名稱(chēng)節(jié)點(diǎn)的調(diào)度來(lái)進(jìn)行數(shù)據(jù)的存儲(chǔ)和檢索,并且向名稱(chēng)節(jié)點(diǎn)定期發(fā)送自己所存儲(chǔ)的塊的列表。 每個(gè)數(shù)據(jù)節(jié)點(diǎn)中的數(shù)據(jù)會(huì)被保存在各自節(jié)點(diǎn)的本地Linux文件系統(tǒng)中。
往期推薦
下方二維碼關(guān)注我

技術(shù)草根,堅(jiān)持分享 編程,算法,架構(gòu)

看完文章,餓了點(diǎn)外賣(mài),點(diǎn)擊 ??《無(wú)門(mén)檻外賣(mài)優(yōu)惠券,每天免費(fèi)領(lǐng)!》













