您好,登錄后才能下訂單哦!
這篇文章主要講解了“HDFS是怎么做文件管理和容錯的”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“HDFS是怎么做文件管理和容錯的”吧!
HDFS 會將數據文件切分成一個個小的數據塊進行存儲,同時會將這些數據塊的副本保存多份,分別保存到不同的 DataNode 上。HDFS 中數據塊的副本數由 hdfs-site.xml
文件中的dfs.replication
屬性決定,配置屬性如下:
<property> <name>dfs.replication</name> <value>3</value></property>
Hadoop 默認的副本數為3,并且在機架的存放上也有一定的策略。Hadoop 的默認布局策略,即默認的副本存放策略如下:
(1)第 1 個副本存放在 HDFS 客戶端所在的節點上。
(2)第 2 個副本存放在與第1個副本不同的機架上,并且是隨機選擇的節點。
(3)第 3 個副本存放在與第2個副本相同的機架上,并且是不同的節點。
HDFS 的數據讀取過程需要客戶端先訪問 NameNode,獲取元數據信息,然后到具體的 DataNode 上讀取數據,如下圖所示:
(1)客戶端向NameNode發起請求,讀取元數據信息。NameNode上存儲著整個HDFS集群的元數據信息,這些元數據信息包括文件名,所有者,所在組,權限,數據塊和 DataNode列表。
這個過程中還要對客戶端的身份信息進行驗證,同時檢測是否存在要讀取的文件,并且需要驗證客戶端的身份是否具有訪問權限。
(2)NameNode 將相關的元數據信息返回給客戶端。
(3)客戶端到指定的 DataNode 上讀取相應的數據塊。
(4)DataNode 返回相應的數據塊信息。
第(3)和(4)步會持續進行,一直到文件的所有數據塊都讀取完畢或者 HDFS 客戶端主動關閉了文件流為止。
HDFS 中的數據寫入過程同樣需要客戶端先訪問 NameNode,獲取元數據信息,然后到具體的 DataNode 上寫入數據,如圖所示
以下是具體步驟:
(1)客戶端請求 NameNode 獲取元數據信息。這個過程中,NameNode 要對客戶端的省份信息進行驗證,同時需要驗證客戶端的身份是否具有寫權限。
(2)NameNode 返回相應的元數據信息給客戶端。
(3)客戶端向第一個 DataNode 寫數據。
(4)第 1 個 DataNode 向第 2 個 DataNode 寫數據。
(5)第 2 個 DataNode 向第 3 個 DataNode 寫數據。
(6)第 3 個 DataNode 向第 2 個 DataNode 返回確認結果信息。
(7)第 2 個 DataNode 向第 1 個 DataNode 返回確認結果信息。
(8)第 1 個 DataNode 向客戶端返回確認結果信息。
其中,第(4)步和第(5)步是異步執行的,當 HDFS 中的多個 DataNode 發生故障或者發生錯誤時,只要正確寫入了滿足最少數目要求的數據副本數,HDFS客戶端就可以從數據塊的副本中恢復數據。
最少數目要求的數據副本數由hdfs-site.xml
文件中的dfs.namenode.replication.min
屬性決定,配置屬性如下:
<property> <name>dfs.namenode.replication.min</name> <value>1</value></property>
最少數目要求的數據副本數默認為1,即只要正確寫入了數據的一個副本,客戶端就可以從數據副本中恢復數據。
通常,在校驗數據是否損壞時可以用如下方式。
(1)當數據第一次引入時,計算校驗和,
(2)當數據經過一系列的傳輸或者復制時,再次計算校驗和。
(3)對比第(1)和第(2)步的校驗和是否一致,如果兩次數據的校驗和不一致,則證明數據已經被破壞。
注意:這種使用校驗和來驗證數據的技術只能檢測數據是否被損壞,并不能修復數據。
HDFS中校驗數據是否損壞使用的也是校驗和技術,無論是進行數據的寫入還是進行數據的讀取,都會驗證數據的校驗和。校驗和的字節數由core-site.xml
文件中的io.bytes.per.checksum
屬性指定,默認的字節長度為 512 B,具體配置如下:
<property> <name>io.bytes.per.checksum</name> <value>512</value></property>
當 HDFS 寫數據時,HDFS 客戶端會將要寫入的數據及對應數據的校驗和發送到 DataNode 組成的復制管道中,其中最后一個 DataNode 負責驗證數據的校驗和是否一致。如果檢測到校驗和與 HDFS 客戶端發送的校驗和不一致,則 HDFS 客戶端 會收到校驗和異常的信息,可以在程序中捕獲到這個異常,進行相應的處理,如重新寫入數據或者用其他方式處理。
HDFS 讀數據時也會驗證校驗和,此時會將它們與 DataNode 中存儲的校驗和進行比較。如果其與 DataNode 中存儲的校驗和不一致,則說明數據已經損壞,需要重新從其他 DataNode 讀取數據。其中,每個 DataNode 都會保存一個校驗和日志,客戶端成功驗證一個數據塊之后,DataNode會更新該校驗和日志。
除此之外,每個 DataNode 也會在后臺運行一個掃描器(DataBlockScanner),定期驗證存儲在這個 DataNode 上的所有數據塊。
由于 HDFS 提供的數據塊副本機制,當一個數據塊損壞時,HDFS 能夠自動復制其他完好的數據塊來修復損壞的數據塊,得到一個新的,完好的數據塊,以達到系統設置的副本數要求,因此在某些數據塊出現損壞時,保證了數據的完整性。
HDFS 的容錯機制大體上可以分為兩個方面:文件系統的容錯和 Hadoop 自身的容錯。
文件系統的容錯可以通過 NameNode 高可用、SecondaryNameNode 機制、數據塊副本機制和心跳機制來實現。
注意:當以本地模式或者偽集群模式部署 Hadoop 時,會存在 SeconddayNameNode;當以集群模式部署 Hadoop 時,如果配置了 NameNode 的 HA 機制,則不會存在 SecondaryNameNode,此時會存在備 NameNode。
在這里重點說下集群模式下 HDFS 的容錯,有關 SecondaryNameNode 機制可參見上一篇文章《前方高能 | HDFS 的架構,你吃透了嗎?》的說明:
HDFS 的容錯機制如圖所示:
具體的流程如下:
(1)備 NameNode 實時備份主 NameNode 上的元數據信息,一旦主 NameNode 發生故障不可用,則備 NameNode 迅速接管主 NameNode 的工作。
(2)客戶端向 NameNode 讀取元數據信息。
(3)NameNode 向客戶端返回元數據信息。
(4)客戶端向 DataNode 讀取/寫入 數據,此時會分為讀取數據和寫入數據兩種情況。
① 讀取數據:HDFS 會檢測文件塊的完整性,確認文件塊的檢驗和是否一致,如果不一致,則從其他的 DataNode 上獲取相應的副本。
② 寫入數據:HDFS 會檢測文件塊的完整性,同時記錄新創建的文件的所有文件塊的校驗和。
(5) DataNode 會定期向 NameNode 發送心跳信息,將自身節點的狀態告知 NameNode;NameNode 會將 DataNode 需要執行的命令放入心跳信息的返回結果中,返回給 DataNode 執行。
當 DataNode 發生故障沒有正常發送心跳信息時,NameNode 會檢測文件塊的副本數是否小于 系統設置值,如果小于設置值,則自動復制新的副本并分發到其他的 DataNode 上。
(6)集群中有數據關聯的 DataNode 之間復制數據副本。
當集群中的 DataNode 發生故障而失效,或者在集群中添加新的 DataNode 時,可能會導致數據分布不均勻。當某個 DataNode 上的空閑空間資源大于系統設置的臨界值時,HDFS 就會從 其他的 DataNode 上將數據遷移過來。相對地,如果某個 DataNode 上的資源出現超負荷運載,HDFS 就會根據一定的規則尋找有空閑資源的 DataNode,將數據遷移過去。
還有一種從側面說明 HDFS 支持容錯的機制,即當從 HDFS 中刪除數據時,數據并不是馬上就會從 HDFS 中被刪除,而是會將這些數據放到“回收站”目錄中,隨時可以恢復,直到超過了一定的時間才會真正刪除這些數據。
Hadoop 自身的容錯理解起來比較簡單,當升級 Hadoop 系統時,如果出現 Hadoop 版本不兼容的問題,可以通過回滾 Hadoop 版本的方式來實現自身的容錯。
感謝各位的閱讀,以上就是“HDFS是怎么做文件管理和容錯的”的內容了,經過本文的學習后,相信大家對HDFS是怎么做文件管理和容錯的這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。