1. 程式人生 > >HDFS如何保證資料的完整性

HDFS如何保證資料的完整性

在讀寫過程中,由校驗和檢測資料的完整性

客戶端寫入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上的所有資料塊,避免磁碟損壞。