hadoop API 學習小結(二)

一、數據的完整性

由於每個磁盤或者網絡上的I/O操作肯能會對正在讀寫的數據不慎引入錯誤,如果通過的數據流量非常大,數據發生損壞的機率非常高。

檢測損壞數據的常用方法是在第一次進入系統時計算數據的校驗和,然後只要數據是在一個不可靠的通道上傳輸,就可能被損壞。如果新生成的校驗和不完全匹配原始的校驗和,那麼數據就會被認爲是被損壞了。這項技術不提供任何方式來修復數據,僅僅是錯誤檢測。(有可能校驗和出錯,但數據是正確的,但肯能性不大)。

熟悉數據結構或網絡編程的同學都知道一種常用的錯誤檢測代碼 CRC-32(循環冗餘檢測),計算一個32位的任何大小輸入的整數校驗和。


二、HDFS以透明方式校驗所以寫入它的數據,在默認設置下,會在讀取數據時驗證校驗和。針對每個io.byte.per.checksum字節,都會創建一個單獨的校驗和。默認值爲512字節。當客戶端寫入數據並且將它發送到一個數據節點的管線中,管線上的最後一個數據節點驗證校驗和,如果此節點檢測到錯誤,客戶端會收到一個Checksum Exception,是IOException的一個子類。如果客戶端讀取數據塊時檢測到錯誤,它在拋出ChecksumException前報告該壞塊以及試圖從名稱節點中讀取數據節點,名稱節點標記該塊已損壞,會從其他副本複製一個新的副本,這樣它的副本數就會迴歸到預期的數量。損壞的副本將被刪除。

禁用校驗和:

(1)在用open()方法讀取文件前,傳一個falseFileSystem中的setVerifyChecksum()方法來禁用校驗和。

(2)shell命令,如-get,=、-copyToLocal -ignoreCrc等。

(3)底層文件系統原生支持校驗和,是通過RawLocalFileSystem 來代替 LocalFileSystem完成的。如果只想針對某些讀取禁用校驗和,可以創建一個RawLocalFileSystem實例,

FileSystem fs = new RawLocalFileSystem();

fs.initialize(null,conf);


三、當寫入一個名爲filename的文件時,文件系統的客戶端以透明方式創建一個隱藏的文件.filename.crc,在同一個文件夾下包含每個文件塊的校驗和。比如HDFS塊,大小受io.bytes.per.checksum屬性控制,默認爲512字節。塊的大小作爲元數據儲存在.crc文件中。讀取文件過程中會對校驗和進行驗證,如果檢測到錯誤,本地文件系統拋出Checksum Exception。


四、ChecksumFileSystem校驗和文件系統

繼承自FilterFileSystem類,爲每個原始文件創建一個校驗和文件,這些操作都在客戶端完成。它很容易添加到各種文件系統中,如:

FileSyatem rawFs = new LocalFileSystem();

FileSystem checksummedFs = new ChecksumFileSystem(rawFs);  //爲rawFs創建校驗和文件實例

方法:

getRawFilwSystem() //獲得原始文件系統

getChecksumFile(Path file) //返回與file相關的校驗和文件,後綴名爲.crc

isChecksumFile(Path file)   //如果file爲校驗和文件,返回true

reportChecksumFailure(Path f, FSDataInputStream in, long inPos, FSDataInputStream sums, long sumsPos) //向文件系統報告校驗錯誤

setVerifyChecksum(boolean verifyChecksum)  //設置是否驗證校驗

getChecksumLength(long size, int bytesPerSum)  //根據參數字節計算校驗和長度

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章