HDFS如何保證資料的完整性
阿新 • • 發佈:2018-12-09
在讀寫過程中,由校驗和檢測資料的完整性
客戶端寫入datanode的時候,HDFS會對寫入的資料計算校驗和,預設每512個位元組校驗一次校驗和,由dfs.bytes-per-checksum配置,在 hdfs-default.xml中配置
<property> <name>dfs.stream-buffer-size</name> <value>4096</value> <description>The size of buffer to stream files. The size of this buffer should probably be a multiple of hardware page size (4096 on Intel x86), and it determines how much data is buffered during read and write operations.</description> </property> <property> <name>dfs.bytes-per-checksum</name> <value>512</value> <description>The number of bytes per checksum. Must not be larger than dfs.stream-buffer-size</description> </property>
HDFS資料的完整性主要體現在HDFS讀取資料完整性、寫資料完整性、還有磁碟完整性
客戶端寫資料的時候,將資料和校驗和傳送到一系列由datanode組成的管線,管線中的最後一個datanode負責校驗校驗和,如果發現數據校驗和對不上,則丟擲異常,hdfs會以特定方式處理,例如重試這個操作。
讀資料時也會驗證校驗和,把讀出來的資料和讀出來的校驗和校驗,確保讀出的資料是正確的,每個datanode都保持著一個用於驗證的校驗和日誌,日誌中儲存著每個資料塊的驗證時間,客戶端每驗證完一個數據塊,就會更新日誌。
如果在讀取資料的過程中,如果檢測到資料校驗錯誤,首先會通知namenode這個已損壞資料塊以及正在讀取的datanode,再丟擲ChecksumException異常。namenode將這個資料塊副本標記為已損壞,不再將客戶端請求傳送到這datanode上,並且會把這個資料塊的一個副本複製到另一個datanode上,這樣資料塊的副本因子又可以變成期望水平,預設為3,最後已損壞的資料塊會被刪除
此外datanode也會在後臺執行緒中執行一個執行緒定期檢查datanode上的所有資料塊,避免磁碟損壞。