作者 | 大尊
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的成縣網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!hdfs是hadoop的分布式文件系統(tǒng),即Hadoop Distributed Filesystem。下面主要講下HDFS設(shè)計(jì)中的比較重要的點(diǎn),使讀者能通過(guò)簡(jiǎn)短的文章一窺HDFS的全貌,適合對(duì)HDFS有一點(diǎn)了解,但是對(duì)HDFS又感到困惑的初學(xué)者。本文主要參考的是hadoop 3.0的官方文檔。
鏈接:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
當(dāng)數(shù)據(jù)集的大小超過(guò)了一臺(tái)物理機(jī)所能存儲(chǔ)的能力時(shí),就需要將它進(jìn)行分區(qū)并存儲(chǔ)到若干不同的獨(dú)立的計(jì)算機(jī)上,其中管理跨多臺(tái)計(jì)算機(jī)存儲(chǔ)的文件系統(tǒng)稱為分布式文件系統(tǒng)。
使用HDFS的場(chǎng)景
HDFS的工作模式
文件系統(tǒng)命名空間(namespace)
數(shù)據(jù)復(fù)制
文件系統(tǒng)元數(shù)據(jù)的持久化
通訊協(xié)議
健壯性
數(shù)據(jù)組織
可訪問(wèn)性
HDFS適合于以流式數(shù)據(jù)訪問(wèn)模式來(lái)存儲(chǔ)超大的文件。即一次寫(xiě)入,多次讀取,在數(shù)據(jù)集上長(zhǎng)時(shí)間進(jìn)行各種分析,每次分析都涉及該數(shù)據(jù)集數(shù)據(jù)的大部分甚至全部,對(duì)于超大文件,hadoop目前以支持存儲(chǔ)PB級(jí)數(shù)據(jù)。
HDFS并不適合要求低時(shí)間延遲數(shù)據(jù)訪問(wèn)的應(yīng)用,因?yàn)镠DFS是為高數(shù)據(jù)吞吐量應(yīng)用而優(yōu)化的,這就有可能以時(shí)間延遲大為代價(jià)。
HDFS文件系統(tǒng)所能存儲(chǔ)的文件總數(shù)受限于namenode的內(nèi)存容量,根據(jù)經(jīng)驗(yàn),100百萬(wàn)的文件,且每個(gè)文件占一個(gè)數(shù)據(jù)塊,那至少需要300MB的內(nèi)存。
目前hadoop文件可能只有一個(gè)writer,而且寫(xiě)操作總是將數(shù)據(jù)添加在文件末尾,不支持在文件的任意位置進(jìn)行修改。
相對(duì)于普通文件系統(tǒng)的數(shù)據(jù)塊,HDFS也有塊的概念,默認(rèn)是128MB,HDFS上的文件也被劃分成塊大小的多個(gè)分塊,作為獨(dú)立的存儲(chǔ)單元,不過(guò)HDFS中小于一個(gè)塊大小的文件不會(huì)占據(jù)整個(gè)塊的空間。如果沒(méi)有特別指出,文中提到的塊特指HDFS的塊。
為何HDFS的塊如此之大,其目的是為了最小化尋址開(kāi)銷(xiāo)。這個(gè)數(shù)也不能設(shè)置的過(guò)大,mapreduce中的map任務(wù)通常一次只處理一個(gè)塊中的數(shù)據(jù),因此如果任務(wù)數(shù)太少,作業(yè)的運(yùn)行速度就會(huì)比較慢。
HDFS采用master/slave架構(gòu),即一個(gè)namenode(管理者)多個(gè)datanode(工作者)。
namenode負(fù)責(zé)管理文件系統(tǒng)的命名空間。維護(hù)著文件系統(tǒng)樹(shù)和整個(gè)樹(shù)內(nèi)所有的文件和目錄,這些信息都保存在兩個(gè)文件中,命名空間鏡像文件和編輯日志文件。namenode也記錄了每個(gè)文件中各個(gè)塊所在的數(shù)據(jù)節(jié)點(diǎn)信息。datanode是文件系統(tǒng)的工作節(jié)點(diǎn),它們需要存儲(chǔ)并檢索數(shù)據(jù)塊(受客戶端或namenode調(diào)度),并定期向namenode發(fā)送它們所存儲(chǔ)的塊的列表。
如果沒(méi)有namenode,文件系統(tǒng)將無(wú)法使用,因?yàn)槲覀儾恢廊绾胃鶕?jù)datanode的塊重建文件,所以對(duì)namenode進(jìn)行容錯(cuò)是非常重要的。為此hadoop提供了兩種機(jī)制。
第一種機(jī)制是備份那些組成文件系統(tǒng)元數(shù)據(jù)持久狀態(tài)的文件。一般,在將持久化文件寫(xiě)入本地磁盤(pán)的同時(shí),寫(xiě)入遠(yuǎn)程掛載的NFS。
第二種方法是運(yùn)行一個(gè)輔助namenode,這個(gè)輔助namenode定期通過(guò)編輯日志合并命名空間鏡像,并在本地保存合并后的命名空間鏡像的副本,在namenode發(fā)生故障時(shí)啟用。但是在主節(jié)點(diǎn)失效時(shí),難免會(huì)丟失部分?jǐn)?shù)據(jù),這時(shí)可以把存儲(chǔ)在NFS的namenode元數(shù)據(jù)復(fù)制到輔助的namenode上作為新的namenode運(yùn)行。這其中涉及到故障轉(zhuǎn)移的機(jī)制。稍后會(huì)做一點(diǎn)分析。
HDFS支持傳統(tǒng)的層次型文件組織結(jié)構(gòu)。用戶或者應(yīng)用程序可以創(chuàng)建目錄,然后將文件保存在這些目錄里。
文件系統(tǒng)名字空間的層次結(jié)構(gòu)和大多數(shù)現(xiàn)有的文件系統(tǒng)類似:用戶可以創(chuàng)建、刪除、移動(dòng)或重命名文件。HDFS支持用戶磁盤(pán)配額和訪問(wèn)權(quán)限控制,目前還不支持硬鏈接和軟鏈接。但是HDFS架構(gòu)并不妨礙實(shí)現(xiàn)這些特性。
Namenode負(fù)責(zé)維護(hù)文件系統(tǒng)的名字空間,任何對(duì)文件系統(tǒng)名字空間或?qū)傩缘男薷亩紝⒈籒amenode記錄下來(lái)。應(yīng)用程序可以設(shè)置HDFS保存的文件的副本數(shù)目。文件副本的數(shù)目稱為文件的副本系數(shù),這個(gè)信息也是由Namenode保存的。
HDFS被設(shè)計(jì)成能夠在一個(gè)大集群中跨機(jī)器可靠地存儲(chǔ)超大文件。它將每個(gè)文件存儲(chǔ)成一系列的數(shù)據(jù)塊,除了最后一個(gè),所有的數(shù)據(jù)塊都是同樣大小的。
為了容錯(cuò),文件的所有數(shù)據(jù)塊都會(huì)有副本。每個(gè)文件的數(shù)據(jù)塊大小和副本系數(shù)都是可配置的。 應(yīng)用程序可以指定某個(gè)文件的副本數(shù)目。副本系數(shù)可以在文件創(chuàng)建的時(shí)候指定,也可以在之后改變。
HDFS中的文件都是一次性寫(xiě)入的,并且嚴(yán)格要求在任何時(shí)候只能有一個(gè)寫(xiě)入者。
Namenode全權(quán)管理數(shù)據(jù)塊的復(fù)制,它周期性地從集群中的每個(gè)Datanode接收心跳信號(hào)和塊狀態(tài)報(bào)告(Blockreport)。當(dāng)一個(gè)Datanode啟動(dòng)時(shí),它會(huì)掃描本地文件系統(tǒng),產(chǎn)生一個(gè)這些本地文件對(duì)應(yīng)的所有HDFS數(shù)據(jù)塊的列表,然后作為報(bào)告發(fā)送到Namenode,這個(gè)報(bào)告就是塊狀態(tài)報(bào)告。接收到心跳信號(hào)意味著該Datanode節(jié)點(diǎn)工作正常。塊狀態(tài)報(bào)告包含了一個(gè)該Datanode上所有數(shù)據(jù)塊的列表。
數(shù)據(jù)塊列表獲取。查看數(shù)據(jù)塊的健康狀態(tài):hdfs fsck / -files -block或者h(yuǎn)dfs fsck /
HDFS的數(shù)據(jù)塊存儲(chǔ)在以_blk為前綴名的文件中,每個(gè)塊還有一個(gè)相關(guān)的帶有.meta后綴的元數(shù)據(jù)文件,元數(shù)據(jù)文件包括頭部和該塊各區(qū)段的一系列校驗(yàn)和。
當(dāng)數(shù)據(jù)塊的數(shù)量增加到一定規(guī)模時(shí),datanode會(huì)創(chuàng)建一個(gè)子目錄來(lái)存放新的數(shù)據(jù)塊及元數(shù)據(jù)信息。如果當(dāng)前目錄已經(jīng)存儲(chǔ)了64個(gè)(通過(guò)dfs.datanode.numlocks屬性設(shè)置)數(shù)據(jù)塊時(shí),就創(chuàng)建一個(gè)子目錄,終極目標(biāo)是設(shè)計(jì)一顆高扇出的目錄樹(shù)。
如果dfs.datanode.data.dir屬性指定了不同磁盤(pán)的多個(gè)目錄,那么數(shù)據(jù)塊會(huì)以輪轉(zhuǎn)(round-robin)的方式寫(xiě)入到各個(gè)目錄中。
在每個(gè)datanode上也會(huì)運(yùn)行一個(gè)塊掃描器,定期檢測(cè)本節(jié)點(diǎn)上的所有塊,從而在客戶端讀取到壞塊之前就及時(shí)的檢測(cè)和修復(fù)壞塊。默認(rèn)情況下每隔3周會(huì)測(cè)試塊的狀態(tài),并對(duì)可能的故障進(jìn)行修復(fù)。
用戶可以通過(guò)http://datanode:50070/blockScannerReport獲取該datanode的塊檢測(cè)報(bào)告。
副本存放
副本的存放是HDFS可靠性和性能的關(guān)鍵。優(yōu)化的副本存放策略是HDFS區(qū)分于其他大部分分布式文件系統(tǒng)的重要特性。這種特性需要做大量的調(diào)優(yōu),并需要經(jīng)驗(yàn)的積累。HDFS采用一種稱為機(jī)架感知(rack-aware)的策略來(lái)改進(jìn)數(shù)據(jù)的可靠性、可用性和網(wǎng)絡(luò)帶寬的利用率。目前實(shí)現(xiàn)的副本存放策略只是在這個(gè)方向上的第一步。
通過(guò)一個(gè)機(jī)架感知的過(guò)程,Namenode可以確定每個(gè)Datanode所屬的機(jī)架id。一個(gè)簡(jiǎn)單但沒(méi)有優(yōu)化的策略就是將副本存放在不同的機(jī)架上。這樣可以有效防止當(dāng)整個(gè)機(jī)架失效時(shí)數(shù)據(jù)的丟失,并且允許讀數(shù)據(jù)的時(shí)候充分利用多個(gè)機(jī)架的帶寬。這種策略設(shè)置可以將副本均勻分布在集群中,有利于當(dāng)組件失效情況下的負(fù)載均衡。但是,因?yàn)檫@種策略的一個(gè)寫(xiě)操作需要傳輸數(shù)據(jù)塊到多個(gè)機(jī)架,這增加了寫(xiě)的代價(jià)。
在大多數(shù)情況下,副本系數(shù)是3,HDFS的存放策略是將一個(gè)副本存放在本地機(jī)架的節(jié)點(diǎn)上,一個(gè)副本放在同一機(jī)架的另一個(gè)節(jié)點(diǎn)上,最后一個(gè)副本放在不同機(jī)架的節(jié)點(diǎn)上。這種策略減少了機(jī)架間的數(shù)據(jù)傳輸,這就提高了寫(xiě)操作的效率。
而在現(xiàn)實(shí)中,在hadoop2.0中,datanode數(shù)據(jù)副本存放磁盤(pán)選擇策略有兩種方式:
第一種是沿用hadoop1.0的磁盤(pán)目錄輪詢方式,實(shí)現(xiàn)類:
RoundRobinVolumeChoosingPolicy.java
第二種是選擇可用空間足夠多的磁盤(pán)方式存儲(chǔ),實(shí)現(xiàn)類:AvailableSpaceVolumeChoosingPolicy.java
第二種策略對(duì)應(yīng)的配置項(xiàng)是:
如果不配置,默認(rèn)使用第一種方式,既輪詢選擇磁盤(pán)來(lái)存儲(chǔ)數(shù)據(jù)副本,但是輪詢的方式雖然能夠保證所有磁盤(pán)都能夠被使用,但是經(jīng)常會(huì)出現(xiàn)各個(gè)磁盤(pán)直接數(shù)據(jù)存儲(chǔ)不均衡問(wèn)題,有的磁盤(pán)存儲(chǔ)得很滿了,而有的磁盤(pán)可能還有很多存儲(chǔ)空間沒(méi)有得到利用,所有在hadoop2.0集群中,最好將磁盤(pán)選擇策略配置成第二種,根據(jù)磁盤(pán)空間剩余量來(lái)選擇磁盤(pán)存儲(chǔ)數(shù)據(jù)副本,這樣一樣能保證所有磁盤(pán)都能得到利用,還能保證所有磁盤(pán)都被利用均衡。
在采用第二種方式時(shí)還有另外兩個(gè)參數(shù)會(huì)用到:
默認(rèn)值是10737418240,既10G,一般使用默認(rèn)值就行。官方解釋為,首先計(jì)算出兩個(gè)值,一個(gè)是所有磁盤(pán)中大可用空間,另外一個(gè)值是所有磁盤(pán)中最小可用空間,如果這兩個(gè)值相差小于該配置項(xiàng)指定的閥值時(shí),則就用輪詢方式的磁盤(pán)選擇策略選擇磁盤(pán)存儲(chǔ)數(shù)據(jù)副本。
默認(rèn)值是0.75f,一般使用默認(rèn)值就行。官方解釋為,有多少比例的數(shù)據(jù)副本應(yīng)該存儲(chǔ)到剩余空間足夠多的磁盤(pán)上。該配置項(xiàng)取值范圍是0.0-1.0,一般取0.5-1.0,如果配置太小,會(huì)導(dǎo)致剩余空間足夠的磁盤(pán)實(shí)際上沒(méi)分配足夠的數(shù)據(jù)副本,而剩余空間不足的磁盤(pán)取需要存儲(chǔ)更多的數(shù)據(jù)副本,導(dǎo)致磁盤(pán)數(shù)據(jù)存儲(chǔ)不均衡。
副本選擇
為了降低整體的帶寬消耗和讀取延時(shí),HDFS會(huì)盡量讓讀取程序讀取離它最近的副本。如果在讀取程序的同一個(gè)機(jī)架上有一個(gè)副本,那么就讀取該副本。如果一個(gè)HDFS集群跨越多個(gè)數(shù)據(jù)中心,那么客戶端也將首先讀本地?cái)?shù)據(jù)中心的副本。
安全模式
Namenode啟動(dòng)后會(huì)進(jìn)入一個(gè)稱為安全模式的特殊狀態(tài)。 處于安全模式的Namenode是不會(huì)進(jìn)行數(shù)據(jù)塊的復(fù)制的。Namenode從所有的 Datanode接收心跳信號(hào)和塊狀態(tài)報(bào)告。塊狀態(tài)報(bào)告包括了某個(gè)Datanode所有的數(shù)據(jù)塊列表。每個(gè)數(shù)據(jù)塊都有一個(gè)指定的最小副本數(shù)。
當(dāng)Namenode檢測(cè)確認(rèn)某個(gè)數(shù)據(jù)塊的副本數(shù)目達(dá)到這個(gè)最小值(最小值默認(rèn)是1,由dfs.namenode.replication.min屬性設(shè)置),那么該數(shù)據(jù)塊就會(huì)被認(rèn)為是副本安全(safely replicated)的;在一定百分比(這個(gè)參數(shù)可配置,默認(rèn)是0.999f,屬性值為dfs.safemode.threshold.pct)的數(shù)據(jù)塊被Namenode檢測(cè)確認(rèn)是安全之后(加上一個(gè)額外的30秒等待時(shí)間),Namenode將退出安全模式狀態(tài)。接下來(lái)它會(huì)確定還有哪些數(shù)據(jù)塊的副本沒(méi)有達(dá)到指定數(shù)目,并將這些數(shù)據(jù)塊復(fù)制到其他Datanode上。
如果datanode丟失的block達(dá)到一定的比例,namenode就會(huì)一直處于安全模式即只讀模式。
當(dāng)namenode處于安全模式時(shí),該怎么處理?
找到問(wèn)題所在,進(jìn)行修復(fù)(比如修復(fù)宕機(jī)的datanode)。
或者可以手動(dòng)強(qiáng)行退出安全模式(沒(méi)有真正解決問(wèn)題): hdfs namenode --safemode leave。
在hdfs集群正常冷啟動(dòng)時(shí),namenode也會(huì)在safemode狀態(tài)下維持相當(dāng)長(zhǎng)的一段時(shí)間,此時(shí)你不需要去理會(huì),等待它自動(dòng)退出安全模式即可。
用戶可以通過(guò)dfsadmin -safemode value 來(lái)操作安全模式,參數(shù)value的說(shuō)明如下:
enter - 進(jìn)入安全模式
leave - 強(qiáng)制NameNode離開(kāi)安全模式
get - 返回安全模式是否開(kāi)啟的信息
wait - 等待,在執(zhí)行某條命令前先退出安全模式。
Namenode上保存著HDFS的名字空間。對(duì)于任何對(duì)文件系統(tǒng)元數(shù)據(jù)產(chǎn)生修改的操作,Namenode都會(huì)使用一種稱為EditLog的事務(wù)日志記錄下來(lái)。例如,在HDFS中創(chuàng)建一個(gè)文件,Namenode就會(huì)在Editlog中插入一條記錄來(lái)表示;同樣地,修改文件的副本系數(shù)也將往Editlog插入一條記錄。Namenode在本地操作系統(tǒng)的文件系統(tǒng)中存儲(chǔ)這個(gè)Editlog。
整個(gè)文件系統(tǒng)的名字空間,包括數(shù)據(jù)塊到文件的映射、文件的屬性等,都存儲(chǔ)在一個(gè)稱為FsImage的文件中,這個(gè)文件也是放在Namenode所在的本地文件系統(tǒng)上。
Namenode在內(nèi)存中保存著整個(gè)文件系統(tǒng)的名字空間和文件數(shù)據(jù)塊映射(Blockmap)的映像(即FsImage)。這個(gè)關(guān)鍵的元數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)得很緊湊,因而一個(gè)有4G內(nèi)存的Namenode足夠支撐大量的文件和目錄。
當(dāng)Namenode啟動(dòng)時(shí),或者檢查點(diǎn)達(dá)到配置文件中的閥值,它從硬盤(pán)中讀取Editlog和FsImage,將所有Editlog中的事務(wù)作用在內(nèi)存中的FsImage上,并將這個(gè)新版本的FsImage從內(nèi)存中保存到本地磁盤(pán)上,然后刪除舊的Editlog,因?yàn)檫@個(gè)舊的Editlog的事務(wù)都已經(jīng)作用在FsImage上了。這個(gè)過(guò)程稱為一個(gè)檢查點(diǎn)(checkpoint)。
hdfs dfsadmin -fetchImage fsimage.backup
//手動(dòng)從namenode獲取最新fsimage文件,并保存為本地文件。
因?yàn)榫庉嬋罩緯?huì)無(wú)限增長(zhǎng),那么恢復(fù)編輯日志的過(guò)程就會(huì)比較長(zhǎng),解決方案是,運(yùn)行輔助namenode,為主namenode內(nèi)存中的文件系統(tǒng)元數(shù)據(jù)創(chuàng)建檢查點(diǎn)。最終主namenode擁有最新的fsimage文件和更小的edits文件。
這也解釋了輔助namenode和主namenode擁有相近內(nèi)存需求的原因(輔助namenode也需要把fsimage文件載入內(nèi)存)。
創(chuàng)建檢查點(diǎn)的觸發(fā)條件受兩個(gè)配置參數(shù)控制,
dfs.namenode.checkpoint.period屬性(輔助namenode每隔一段時(shí)間就創(chuàng)建檢查點(diǎn),單位s)。dfs.namenode.checkpoint.txns,如果從上一個(gè)檢查點(diǎn)開(kāi)始編輯日志大小達(dá)到多少的事務(wù)數(shù)時(shí),創(chuàng)建檢查點(diǎn)。
在主namenode發(fā)生故障時(shí)(假設(shè)沒(méi)有備份),就可以從輔助的namenode上恢復(fù)數(shù)據(jù)。有兩種實(shí)現(xiàn)方式。
方法一,將相關(guān)的存儲(chǔ)目錄復(fù)制到新的namenode中 。
方法二,使用-importCheckpoint選項(xiàng)啟動(dòng)namenode守護(hù)進(jìn)程,從而將輔助namenode用作新的主namenode,有個(gè)前提時(shí),dfs.namenode.dir屬性定義的目錄中沒(méi)有元數(shù)據(jù)時(shí)。
所有的HDFS通訊協(xié)議都是建立在TCP/IP協(xié)議之上??蛻舳送ㄟ^(guò)一個(gè)可配置的TCP端口連接到Namenode,通過(guò)ClientProtocol協(xié)議與Namenode交互。而Datanode使用DatanodeProtocol協(xié)議與Namenode交互。
一個(gè)遠(yuǎn)程過(guò)程調(diào)用(RPC)模型被抽象出來(lái)封裝ClientProtocol和Datanodeprotocol協(xié)議。在設(shè)計(jì)上,Namenode不會(huì)主動(dòng)發(fā)起RPC,而是響應(yīng)來(lái)自客戶端或 Datanode 的RPC請(qǐng)求。
HDFS的主要目標(biāo)就是即使在出錯(cuò)的情況下也要保證數(shù)據(jù)存儲(chǔ)的可靠性。
常見(jiàn)的三種出錯(cuò)情況是:Namenode出錯(cuò), Datanode出錯(cuò)和網(wǎng)絡(luò)割裂(network partitions)。
心跳檢測(cè),磁盤(pán)數(shù)據(jù)錯(cuò)誤和重新復(fù)制。
每個(gè)Datanode節(jié)點(diǎn)周期性地向Namenode發(fā)送心跳信號(hào)。網(wǎng)絡(luò)割裂可能導(dǎo)致一部分Datanode跟Namenode失去聯(lián)系。Namenode通過(guò)心跳信號(hào)的缺失來(lái)檢測(cè)這一情況,并將這些近期不再發(fā)送心跳信號(hào)Datanode標(biāo)記為宕機(jī),不會(huì)再將新的IO請(qǐng)求發(fā)給它們。任何存儲(chǔ)在宕機(jī)Datanode上的數(shù)據(jù)將不再有效。
Datanode的宕機(jī)可能會(huì)引起一些數(shù)據(jù)塊的副本系數(shù)低于指定值,Namenode不斷地檢測(cè)這些需要復(fù)制的數(shù)據(jù)塊,一旦發(fā)現(xiàn)就啟動(dòng)復(fù)制操作。
設(shè)置合適的datanode心跳超時(shí)時(shí)間,避免用datanode不穩(wěn)定導(dǎo)致的復(fù)制風(fēng)暴。
在下列情況下,也可能需要重新復(fù)制:某個(gè)Datanode節(jié)點(diǎn)失效,某個(gè)副本遭到損壞,Datanode上的硬盤(pán)錯(cuò)誤,或者文件的副本系數(shù)增大。
集群均衡(針對(duì)datanode)
HDFS的架構(gòu)支持?jǐn)?shù)據(jù)均衡策略。如果某個(gè)Datanode節(jié)點(diǎn)上的空閑空間低于特定的臨界點(diǎn),按照均衡策略系統(tǒng)就會(huì)自動(dòng)地將數(shù)據(jù)從這個(gè)Datanode移動(dòng)到其他空閑的Datanode。
個(gè)文件的請(qǐng)求突然增加,那么也可能啟動(dòng)一個(gè)計(jì)劃創(chuàng)建該文件新的副本,并且同時(shí)重新平衡集群中的其他數(shù)據(jù)。這個(gè)均衡策略目前還沒(méi)有實(shí)現(xiàn)。
數(shù)據(jù)完整性(針對(duì)datanode)
從某個(gè)Datanode獲取的數(shù)據(jù)塊有可能是損壞的,損壞可能是由Datanode的存儲(chǔ)設(shè)備錯(cuò)誤、網(wǎng)絡(luò)錯(cuò)誤或者軟件bug造成的。HDFS客戶端軟件實(shí)現(xiàn)了對(duì)HDFS文件內(nèi)容的校驗(yàn)和(checksum)檢查。
當(dāng)客戶端創(chuàng)建一個(gè)新的HDFS文件,會(huì)計(jì)算這個(gè)文件每個(gè)數(shù)據(jù)塊的校驗(yàn)和,并將校驗(yàn)和作為一個(gè)單獨(dú)的隱藏文件保存在同一個(gè)HDFS名字空間下。當(dāng)客戶端獲取文件內(nèi)容后,它會(huì)檢驗(yàn)從Datanode獲取的數(shù)據(jù)跟相應(yīng)的校驗(yàn)和文件中的校驗(yàn)和是否匹配,如果不匹配,客戶端可以選擇從其他Datanode獲取該數(shù)據(jù)塊的副本。
元數(shù)據(jù)磁盤(pán)錯(cuò)誤(針對(duì)namenode出錯(cuò))
FsImage和Editlog是HDFS的核心數(shù)據(jù)結(jié)構(gòu)。如果這些文件損壞了,整個(gè)HDFS實(shí)例都將失效。因而,Namenode可以配置成支持維護(hù)多個(gè)FsImage和Editlog的副本。任何對(duì)FsImage或者Editlog的修改,都將同步到它們的副本上。這種多副本的同步操作可能會(huì)降低Namenode每秒處理的名字空間事務(wù)數(shù)量。然而這個(gè)代價(jià)是可以接受的,因?yàn)榧词笻DFS的應(yīng)用是數(shù)據(jù)密集的,它們也非元數(shù)據(jù)密集的。當(dāng)Namenode重啟的時(shí)候,它會(huì)選取最近的完整的FsImage和Editlog來(lái)使用。
另外一個(gè)可選方案是通過(guò)共享存儲(chǔ)NFS或一個(gè)分布式編輯日志(也叫journal)實(shí)現(xiàn)多namenode節(jié)點(diǎn)(HA),來(lái)增強(qiáng)故障恢復(fù)能力。
在HDFS HA的實(shí)現(xiàn)中,配置了一對(duì)active-standby的namenode,當(dāng)活動(dòng)的namenode失效,備用的namenode就會(huì)接管它的任務(wù)并開(kāi)始服務(wù)于客戶端的請(qǐng)求。
實(shí)現(xiàn)HA需要在架構(gòu)上做如下修改:
namenode之間通過(guò)高可用共享存儲(chǔ)實(shí)現(xiàn)編輯日志的共享,當(dāng)備用namenode接管工作之后,它將通讀共享編輯日志直到末尾,實(shí)現(xiàn)與active namenode狀態(tài)同步,并繼續(xù)讀取由活動(dòng)namenode寫(xiě)入的新條目。
datanode需要同時(shí)向兩個(gè)namenode發(fā)送數(shù)據(jù)塊處理報(bào)告,因?yàn)閿?shù)據(jù)塊映射信息存在namenode的內(nèi)存,而非硬盤(pán)。
客戶端使用特定的機(jī)制處理namenode的失效,這一機(jī)制對(duì)于用戶是透明的。
輔助namenode的角色被namenode所包含,備用namenode為活動(dòng)的namenode命名空間設(shè)置周期性檢查。
快照
快照支持某一特定時(shí)刻的數(shù)據(jù)的復(fù)制備份。利用快照,可以讓HDFS在數(shù)據(jù)損壞時(shí)恢復(fù)到過(guò)去一個(gè)已知正確的時(shí)間點(diǎn)。
數(shù)據(jù)塊
HDFS被設(shè)計(jì)成支持大文件,適用HDFS的是那些需要處理大規(guī)模的數(shù)據(jù)集的應(yīng)用。這些應(yīng)用都是只寫(xiě)入數(shù)據(jù)一次,但卻讀取一次或多次,并且讀取速度應(yīng)能滿足流式讀取的需要。HDFS支持文件的“一次寫(xiě)入多次讀取”語(yǔ)義。一個(gè)典型的數(shù)據(jù)塊大小是128MB。因而,HDFS中的文件總是按照128M被切分成不同的塊,每個(gè)塊盡可能地存儲(chǔ)于不同的Datanode中。
流水線復(fù)制
當(dāng)客戶端向HDFS文件寫(xiě)入數(shù)據(jù)的時(shí)候,一開(kāi)始是寫(xiě)到本地臨時(shí)文件中。假設(shè)該文件的副本系數(shù)設(shè)置為3,當(dāng)本地臨時(shí)文件累積到一個(gè)數(shù)據(jù)塊的大小時(shí),客戶端會(huì)從Namenode獲取一個(gè)Datanode列表用于存放副本。然后客戶端開(kāi)始向第一個(gè)Datanode傳輸數(shù)據(jù),第一個(gè)Datanode一小部分一小部分(4 KB)地接收數(shù)據(jù),將每一部分寫(xiě)入本地倉(cāng)庫(kù),并同時(shí)傳輸該部分到列表中第二個(gè)Datanode節(jié)點(diǎn)。第二個(gè)Datanode也是這樣,一小部分一小部分地接收數(shù)據(jù),寫(xiě)入本地倉(cāng)庫(kù),并同時(shí)傳給第三個(gè)Datanode。最后,第三個(gè)Datanode接收數(shù)據(jù)并存儲(chǔ)在本地。
因此,Datanode能流水線式地從前一個(gè)節(jié)點(diǎn)接收數(shù)據(jù),并在同時(shí)轉(zhuǎn)發(fā)給下一個(gè)節(jié)點(diǎn),數(shù)據(jù)以流水線的方式從前一個(gè)Datanode復(fù)制到下一個(gè)。
HDFS給應(yīng)用提供了多種訪問(wèn)方式。用戶可以通過(guò)Java API接口訪問(wèn),也可以通過(guò)C語(yǔ)言的封裝API訪問(wèn),還可以通過(guò)瀏覽器的方式訪問(wèn)HDFS中的文件。通過(guò)WebDAV協(xié)議訪問(wèn)的方式正在開(kāi)發(fā)中。
DFSShell
HDFS以文件和目錄的形式組織用戶數(shù)據(jù)。它提供了一個(gè)命令行的接口(DFSShell)讓用戶與HDFS中的數(shù)據(jù)進(jìn)行交互。命令的語(yǔ)法和用戶熟悉的其他shell(例如 bash, csh)工具類似。下面是一些動(dòng)作/命令的示例:
DFSAdmin
DFSAdmin 命令用來(lái)管理HDFS集群。這些命令只有HDSF的管理員才能使用。下面是一些動(dòng)作/命令的示例:
瀏覽器接口
一個(gè)典型的HDFS安裝會(huì)在一個(gè)可配置的TCP端口開(kāi)啟一個(gè)Web服務(wù)器用于暴露HDFS的名字空間。用戶可以用瀏覽器來(lái)瀏覽HDFS的名字空間和查看文件的內(nèi)容。
http://ip:50070
文件的刪除和恢復(fù)
當(dāng)垃圾回收生效時(shí),通過(guò)fs shell刪除的文件并沒(méi)有立刻從HDFS中刪除。實(shí)際上,HDFS會(huì)將這個(gè)文件重命名轉(zhuǎn)移到user//.Trash目錄。只要文件還在.Trash目錄中,該文件就可以被迅速地恢復(fù)。文件在Trash中保存的時(shí)間是可配置的,當(dāng)超過(guò)這個(gè)時(shí)間時(shí),Namenode就會(huì)將該文件從名字空間中刪除。刪除文件會(huì)使得該文件相關(guān)的數(shù)據(jù)塊被釋放。注意,從用戶刪除文件到HDFS空閑空間的增加之間會(huì)有一定時(shí)間的延遲。
只要被刪除的文件還在.Trash目錄中,用戶就可以恢復(fù)這個(gè)文件。如果用戶想恢復(fù)被刪除的文件,他/她可以瀏覽.Trash目錄找回該文件。
減少副本系數(shù)
當(dāng)一個(gè)文件的副本系數(shù)被減小后,Namenode會(huì)選擇過(guò)剩的副本刪除。下次心跳檢測(cè)時(shí)會(huì)將該信息傳遞給Datanode。Datanode遂即移除相應(yīng)的數(shù)據(jù)塊,集群中的空閑空間加大。同樣,在調(diào)用setReplication API結(jié)束和集群中空閑空間增加間會(huì)有一定的延遲。
【本文為用戶原創(chuàng)內(nèi)容,轉(zhuǎn)載時(shí)必須標(biāo)注文章的來(lái)源,文章鏈接,文章作者等基本信息】
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。