1.冗余備份
HDFS將每個文件存儲成一系列數(shù)據(jù)塊(Block),默認(rèn)塊大小為64MB (可配置)。為了容錯,文件的所有數(shù)據(jù)塊都會有副本(副本數(shù)量即復(fù)制因子,可配置)。HDFS的文件都是一次性寫入的,并且嚴(yán)格限制為任何時候都只有一個寫用戶。DataNode使用本地文件系統(tǒng)存儲HDFS的數(shù)據(jù),但是它對HDFS的文件一無所知,只是用一個個文件存儲HDFS的每個數(shù)據(jù)塊。當(dāng)DataNode啟動時,它會遍歷本地文件系統(tǒng),產(chǎn)生一份HDFS數(shù)據(jù)塊和本地文件對應(yīng)關(guān)系的列表,并把這個報告發(fā)給NameNode,這就是塊報告(Blockreport)。塊報告包括了DataNode上所有塊的列表。
2.副本存放
HDFS集群一般運(yùn)行在多個機(jī)架上,不同機(jī)架上機(jī)器的通信需要通過交換機(jī)。通常情況下,副本的存放策略很關(guān)鍵,機(jī)架內(nèi)節(jié)點之間的帶寬比跨機(jī)架節(jié)點之間的帶寬要大,它能影響HDFS的可靠性和性能。HDFS采用機(jī)架感知(Rack-aware)的策略來改進(jìn)數(shù)據(jù)的可靠性、可用性和網(wǎng)絡(luò)帶寬的利用率。通過機(jī)架感知,NameNode可以確定每個DataNode所屬的機(jī)架ID。一般情況下,當(dāng)復(fù)制因子是3的時候,HDFS的部署策略是將一個副本放在同一機(jī)架上的另一個節(jié)點,一個副本存放在本地機(jī)架上的節(jié)點,最后一個副本放在不同機(jī)架上的節(jié)點。機(jī)架的錯誤遠(yuǎn)比節(jié)點的錯誤少,這個策略可以防止整個機(jī)架失效時數(shù)據(jù)丟失,不會影響到數(shù)據(jù)的可靠性和可用性,又能保證性能。目前,副本存放策略還正在開發(fā)中。圖6-2體現(xiàn)了復(fù)制因子為3的情況下,各數(shù)據(jù)塊的分布情況。

3.心跳檢測
NameNode周期性地從集群中的每個DataNode接受心跳包和塊報告,收到心跳包說明該DataNode工作正常。NameNode會標(biāo)記最近沒有心跳的DataNode為死機(jī),不會發(fā)給它們?nèi)魏涡碌腎/O請求。任何存儲在死機(jī)的DataNode的數(shù)據(jù)將不再有效,DataNode的死機(jī)會造成一些數(shù)據(jù)塊的副本數(shù)下降并低于指定值。NameNode會不斷檢測這些需要復(fù)制的數(shù)據(jù)塊,并在需要的時候重新復(fù)制。重新復(fù)制的引發(fā)可能有多種原因,比如DataNode不可用、數(shù)據(jù)副本的損壞、DataNode上的磁盤錯誤或復(fù)制因子增大等。
4.安全模式
系統(tǒng)啟動時,NameNode會進(jìn)入一個安全模式。此時不會出現(xiàn)數(shù)據(jù)塊的寫操作。NameNode會收到各個DataNode擁有的數(shù)據(jù)塊列表對的數(shù)據(jù)塊報告,因此NameNode獲得所有的數(shù)據(jù)塊信息。數(shù)據(jù)塊達(dá)到最小副本數(shù)時,該數(shù)據(jù)塊就被認(rèn)為是安全的。在一定比例(可配置)的數(shù)據(jù)塊被NameNode檢測確認(rèn)是袁幸之后,再等待若干時間,NameNode自動退出安全模式狀態(tài)。當(dāng)檢測到副本數(shù)不足的數(shù)據(jù)塊時,該塊會被復(fù)制到其他數(shù)據(jù)節(jié)點,以達(dá)到最小副本數(shù)。
5.數(shù)據(jù)完整性檢測
多種原因會造成從DataNode獲取的數(shù)據(jù)塊有可能是損壞的。HDFS客戶端軟件實現(xiàn)了對HDFS文件內(nèi)容的校驗和(Checksum)檢查,在HDFS文件創(chuàng)建時,計算每個數(shù)據(jù)塊的校驗和,并將校驗和作為一個單獨(dú)的隱藏文件保存在命名空間下。當(dāng)客戶端獲取文件后,它會檢査從DataNode獲得的數(shù)據(jù)塊對應(yīng)的校驗和是否和隱藏文件中的相同,如果不同,客戶端就會認(rèn)為數(shù)據(jù)塊有損壞,將從其他DataNode獲取該數(shù)據(jù)塊的副本。
6.空間回收
文件被用戶或應(yīng)用程序刪除時,并不是立即就從HDFS中移走,而是先把蘆移動到/trash自錄里。只要還在這個目錄里,文件就可以被迅速恢復(fù)。文件在這個目錄魚的時間是可以配置的,超過了這個時間,系統(tǒng)就會把它從命名空間中刪除件的刪除操作會引起相應(yīng)數(shù)據(jù)塊的釋放,但是從用戶執(zhí)行刪除操作到從系統(tǒng)中看到剩余空間的增加可能會有一個時間延遲。只要文件還在/trash目錄里,用戶可以取消刪除操作。當(dāng)用戶想取消時,可以瀏覽這個目錄并取回文件,這個目錄只保存被刪除文件的最后副本。這個目錄還有一個特性,就是HDFS會使用特殊策略自動刪除文件。當(dāng)前默認(rèn)的策略是:文件超過6個小時后自動刪除,在未來版本里,這個策略可以通過定義良好的接口來配置。
7.元數(shù)據(jù)磁盤失效
映像文件和事務(wù)日志是HDFS的核心數(shù)據(jù)結(jié)構(gòu)。如果這些文件損壞,將會導(dǎo)致HDFS不可用。NameNode可以配置為支持維護(hù)映像文件和事務(wù)日志的多個副本,任何對映像文件或事務(wù)日志的修改,都將同步到它們的副本上。這樣會降低NameNodl處理命名空間事務(wù)的速度,然而這個代價是可以接受的,因為HDFS是數(shù)據(jù)密集,而非元數(shù)據(jù)密集的。當(dāng)NameNode重新啟動時,總是選擇最新的一致的映像文件和事務(wù)日志。在HDFS集群中NameNode是單點存在的,如果它出現(xiàn)故障,必須手動干預(yù)。目前,還不支持自動重啟或切換到另外的NameNode。
8.快照
快照支持存儲某個時間的數(shù)據(jù)復(fù)制,當(dāng)HDFS數(shù)據(jù)損壞時,可以回滾到過去一個已知正確的時間點。HDFS目前還不支持快照功能。