檢測損壞數據的經常使用方法是第一次進入系統時計算數據的校驗和,而後和傳輸後新生成的校驗和進行匹配.若匹配失敗,則認爲數據被損壞了.經常使用CRC-32(cyclic redundancy check,循環冗餘檢查)計算一個32位的任何大小輸入的證書校驗和編程
HDFS會在讀取數據時校驗和,針對數據的每一個io.bytes.per.checksum字節都會建立一個單獨的校驗和,默認爲512字節.所以CRC-32校驗和是4個字節長,存儲開銷都小於1%.數據節點負責在存儲數據及其校驗和驗證它們收到的數據.客戶端寫入數據而且將它發送到一個數據節點上的管線中.在管線的最後一個節點驗證校驗和.若此節點檢測到錯誤,客戶端便收到一個Checksum Exception.這是一個IO Exception.數組
客戶端讀取數據節點上的數據時,會驗證校驗和,將其與數據節點上存儲的校驗和進行對比,每一個數據節點維護一個連續的校驗和驗證日誌.每一個數據節點還會在後臺運行一個DataBlockScanner按期驗證存儲在數據幾點上的全部塊,爲了防止物理存儲介質中的衰退所形成的數據損壞.網絡
若客戶端讀取數據塊時檢測到錯誤,它在拋出Checksum Exception前報告該壞塊以及它試圖從名稱節點中要讀取的數據節點.名稱節點將這個塊標記爲損壞.它會從其餘的副本複製一個新的副本,損壞的副本將被刪除函數
Hadoop本地文件系統執行客戶端的校驗.在寫一個名爲filename的文件時,文件系統的客戶端以透明的方式建立一個隱藏的文件filename.crc.在同一個文件夾下包含每一個文件塊的校驗和.塊的大小做爲元數據存儲在.crc文件中oop
Checksum File System編碼
LocalFileSystem使ChecksumFileSystem校驗文件系統,底層文件系統被稱爲原始文件系統.能夠經過在ChecksumFileSystem中使用gtRanFileSystem()方法來得到日誌
CompressionCodeccode
CompressionCodec有兩個方法用於壓縮或解壓數據,可使用createOutputStreamOut()來建立一個CompressionOutputStream.將其壓縮格式寫入底層的流.調用createOutputStreamIn()獲取一個CompressionInputStream,從而從底層的流讀取未經壓縮的數據對象
CompressionCodecFactory提供了getCodec()方法,從而將文件擴展名映射到相應的CompressionCodec,此方法接受一個Path對象.若要在本地庫應用中大量執行壓縮解壓任務,能夠考慮使用codingpool.排序
序列化
序列化指的是將結構化對象轉爲字節流以便經過網絡進行傳輸或寫入持久存儲的過程,反序列化指的是將本身流轉爲一系列結構化對象的過程.用於處理進程間通訊和持久存儲
Writable接口定義了兩個方法:一個用於將其狀態寫入二進制格式的DataOutput流;另外一個用於從DataInputStream流讀取其狀態.在對整數進行編碼時,在固定長度格式(IntWritable和LongWritable)和可變長度格式(UIntWritable和ULongWritable)之間,固定長度編碼的好處在於值比較均勻的分佈在整個值空間中.大多數數字變量每每分佈不均勻,因此可變長度編碼更節省空間.可變長度編碼的另外一個好處是能夠將VIntWritable編程VLongWritable.
Text類是一種UTF8格式的Writable.Text使用int類型在字符串編碼中存儲字節數.最大值是.Text類的索引位於編碼後的字節系列中,而不是字符串中的Unicode字符.Text類的charAt()返回了一個int類型來表示Unicode代碼點.Text類對象的長度是是UTF-8編碼的字節數.indexOf()返回一個char類型的編碼單元的索引.find()方法是字節偏移量.Text類能夠經過set()函數來重用Text實例
NullWritable
NullWritable是一種特殊的Writable.它的序列化是零長度的被用做佔位符.
Hadoop有四種Writable集合.分別是ArrayWritable,TwoArrayWritable,MapWritable和SortedMapWritable.ArrayWritable和TwoArrayWritable是Writable針對數組和二維數組實例的實現.MapWritable和SortdMapWritable,每一個鍵/值字段的類型都是此字段序列化格式的一部分.類型保存爲單字節,充當一個數組類型的索引.
序列文件
序列文件由一個頭部或多個記錄組成.前三位字節時SEQ字節做爲幻數,緊接着一個版本號.頭部包含鍵/值類的名稱,壓縮細節,用戶定義的元數據和同步標記
MapFile
MapFile是經排序後帶索引的SequenceFile,可根據鍵進行查找
MapFile的fix()方法經常使用於重建被破壞的索引,從零開始建立新的索引
1.將序列文件number.seq納入一個名爲numbr.map的新建目錄,後者將變成MapFile
2.Map Reduce的輸出被重命名爲data文件
3.新建index文件