Hadoop自帶一套原子操作用於數據I/O操作。主要考慮的問題是數據完整性、數據壓縮、序列號、on-disk數據結構。
5.1 數據完整性
- 如果需要處理的數據大到Hadoop的處理極限,數據損壞的機率還是很高的。
- 檢測數據是否損壞的常用措施是在數據第一次引入系統時計算校驗和(checksum),並在數據通過一個不可靠的通道傳輸後再次計算校驗和。但是該技術只能檢測數據錯誤但是不能修復數據,且校驗和也有可能損壞。
- Hadoop ChecksumfileSystem 使用CRC-32計算校驗和,HDFS則用一個更有效的變體CRC-32C。
5.1.1 HDFS的數據完整性
- HDFS會對所有寫入的數據計算校驗和,並在讀取數據時驗證校驗和。
- datanode負責在存儲數據及校驗和之前對數據進行驗證。包括收到客戶端數據或者複製其他datanode數據時執行校驗操作。管線中的最後一個datanode負責驗證校驗和,若檢測到錯誤,會拋出一個IOException異常的一個子類,應用程序需要對該異常做出處理,比如重試。
- 每個datanode也會定期掃描數據,檢測是否存在數據錯誤。
- HDFS存儲着每個數據塊的複本(replica),因此可以修復損壞的數據塊。
- 可以用fs -checksum來檢查一個文件的校驗和,可以檢查兩個文件是否具有相同的內容。
5.1.1 LocalFileSystem
Hadoop的LocalFileSystem執行客戶端的校驗和驗證。
5.1.1 ChecksumFileSystem
LocalFileSystem通過ChecksumFileSystem實現自己的任務。
5.1 壓縮
5.2.1 codec
codec是壓縮-解壓縮算法的一種實現,在Hadoop中一個對CompressionCode接口的實現代表一個codec。
5.2.1 壓縮和輸入分片
- 不壓縮可以分片(spliting)處理,gzip壓縮後無法分片處理。
- LZO壓縮的文件,在預處理時使用索引工具,可實現文件的可切分特性。
- bzip2提供不同數據塊之間的同步標識,因而它支持切分。
- 應該使用哪種切分格式?一些建議,按照效率從高到低排列:
- 使用容器文件格式
- 使用支持切分的壓縮格式
- 在應用中將問卷切分成塊
- 存儲未經壓縮的文件
5.2.1 在MapReduce中使用壓縮
5.3 序列化
- 序列化,是指將結構化對象轉化爲字節流在網絡間傳輸或寫入磁盤進行永久存儲的過程。反序列化是指將字節流轉化爲結構化對象的逆過程。
- 序列化用於分佈式數據處理的兩大領域:進程間通信和永久存儲。
- Hadoop中,系統間多個節點間使用RPC進行交互,RPC序列化格式如下:
- 緊湊
- 快速
- 可擴展
- 支持多語言互操作
- Hadoop使用自己的序列化格式writable