使用者肯定都希望系統在儲存和處理資料時,資料不會有任何丟失或損壞。但是,受網路不穩定、硬體損壞等因素,io操作過程中難免會出現資料丟失或髒資料,難免會出現資料丟失或髒資料,資料傳輸的量越大,出現錯誤的概率就越高。
檢測資料是否損壞的常見措施是,在資料第一次引入系統時計算校驗和(checksum)並儲存,在資料進行傳輸後再次計算校驗和進行對比,如果計算所得的新校驗和和原來的校驗和不匹配,就認為資料已損壞。但該技術並不能修復資料——它只能檢測出資料錯誤。(這正是不使用低端硬體的原因。具體說來,一定要使用ecc記憶體。)注意,校驗和也是可能損壞的,不只是資料,但由於校驗和比資料小得多,所以損壞的可能性非常小。
(1)對本地檔案i/o的檢查
在hadoop中,本地檔案系統的資料完整性由客戶端負責。重點在於存車讀取檔案時進行校驗和的處理。
具體做法是:每當hadoop建立檔案a時,hadoop就會同時在同乙個資料夾下建立隱藏檔案.a.crc,這個檔案記錄了 檔案a的校驗和。針對資料檔案的大小,每512個位元組會生成乙個32位的校驗和(4位元組),可以在src/core/core-default.xml中通過修改io.bytes.per.checksum的大小來修改每個校驗和所針對的檔案的大小。
在hadoop中,校驗和系統單獨為一類,org.apache.hadoop.fs.checksumfilesystem,當需要校驗和機制時,可以很方便的呼叫它來服務。
(2)對hdfs的i/o資料進行檢查
一般來說,hdfs會在三種情況下檢驗校驗和:
datanode接收資料後儲存資料前
datanode接收資料一般有兩種情況:1.從客戶端上傳資料 2.datanode從其他datanode上接收資料。
當客戶端上傳資料時,正在寫資料的客戶端將資料及其校驗和傳送到由一系列datanode組成的pipeline管線。pipeline管線中最後乙個datanode負責驗證校驗和。
datanode資料儲存步驟:(包括從datanode和客戶端兩種傳輸方式)
1.在傳輸資料的最開始階段,hadoop會簡單地檢查資料塊的完整性資訊;
2.依次向各個datanode傳輸資料,包括資料頭資訊、塊資訊、備份個數、校驗和等;
3.hadoop不會在資料每流動到乙個datanode都檢查校驗和,只會在資料流達到最後乙個節點時才檢查校驗和
如果在驗證過程中發現有不一致的塊,就會丟擲checksumexception異常資訊
hadoop資料的完整性檢測,都是通過校驗和的比較來完成,在建立新檔案時(也就是在上傳資料到hdfs上時)將校驗和的值和資料一起儲存起來。namenode會收到來自client、datanode的檢驗和資訊,根據這兩個資訊來維護檔案的塊儲存及向客戶端提供塊讀取服務。
hdfs會對寫入的所有資料計算校驗和,並在讀取資料時驗證校驗和。
常用的錯誤檢測碼是crc-32(迴圈冗餘校驗),任何大小的資料輸入均計算得到乙個32位的整數校驗和。
在寫入檔案時,hdfs為每個資料塊都生成乙個crc檔案。客戶端讀取資料時生成乙個crc與資料節點儲存的crc做比對,如果不匹配則說明資料已經損壞了。資料節點在後台執行乙個程式定期(預設為21天)檢測資料,防止物理儲存介質中位衰減而造成的資料損壞。
datanode在寫入時計算出校驗和,然後每次讀的時候再計算校驗和進行檢驗
hdfs會為每乙個固定長度的資料(乙個個資料報)執行一次校驗和
這個值由io.bytes.per.checksum指定,預設是512位元組。
因為crc32是32位即4個位元組,這樣校驗和占用的空間就會少於原資料的1%。
datanode在儲存收到的資料前會校驗資料的校驗和,比如收到客戶端的資料或者其他副本傳過來的資料。
如hdfs資料流中客戶端寫入資料到hdfs時的資料流,在管道的最後乙個datanode會去檢查這個校驗和
如果發現錯誤,就會丟擲checksumexception到客戶端
從datanode讀資料的時候一樣要檢查校驗和,而且每個datanode還儲存了檢查校驗和的日誌,每次校驗都會記錄到日誌中
除了讀寫操作會檢查校驗和以外,datanode還跑著乙個後台程序(datablockscanner)
定期校驗存在在它上面的block,因為除了讀寫過程中會產生資料錯誤以外,硬體本身也會產生資料錯誤,比如位衰減(bit rot)
Hadoop權威指南 資料完整性
目錄常用的錯誤檢測碼是crc 32 迴圈冗餘校驗 使用rawloaclfilesystem替代localfilesystem localfilesystem通過checkfilesystem來完成自己的任務,該類繼承自filesystem,一般用法如下 filesystem rawfs filesy...
MySQL資料完整性(實體完整性 域完整性)
資料完整性 為保證插入到資料庫中的資料是正確的,防止使用者輸入錯誤的資料 分為實體完整性 域完整性 參照完整性 下節再說 1 實體完整性 實體指的是表中的一行,一行記錄對應乙個實體 通過主鍵實現 主鍵 關鍵字 primary key 特點 不能為null,並且唯一。邏輯主鍵 推薦 例如id,不代表實...
資料完整性
資料完整性定義 是指資料庫中的資料的正確性和完整性。資料完整性的型別 要求的資料。not null。有效檢查。資料的有效範圍檢查。字段檢查約束。資料域。實體完整性。主鍵欄位唯 一 非空。引用完整性引發的問題 1 插入 更新子表記錄的外鍵值在主表主鍵中不存在。2 刪除 更新父表的主鍵記錄有關聯外來鍵記...