1. 程式人生 > >Hadoop的I/O操作

Hadoop的I/O操作

資料完整性

HDFS會對寫入的所有資料計算校驗和,並在讀取資料時驗證校驗和。datanode負責在收到資料後儲存該資料及其校驗和之前對資料進行驗證。datanode的管線中最後一個datanode執行校驗。HDFS儲存著每一個數據塊的複本,因此可以通過資料複本來修復鎖壞的資料塊。可以用hadoop的命令fs -checksum來檢查一個檔案的校驗和,可用於檢查HDFS中兩個檔案是否具有相同的內容。

檔案壓縮

通用的壓縮工具是gzip,是否可切分列表示對應的壓縮演算法是否支援切分,也就是說,是否可以搜尋資料流的任意位置並進一步往下讀取資料。可切分壓縮格式尤其適合MapReduce。

序列化

將結構化物件轉化為位元組流以便在網路上傳輸或寫到磁碟進行永久儲存的過程,反序列化是指將位元組流轉回結構化物件的逆過程。序列化用於分散式資料處理的兩大領域:程序間通訊和永久儲存。

Hadoop使用的是自己的序列化格式Writable,它緊湊、速度快,但不太容易被Java以外的語言進行擴充套件和使用。因為Writable是Hadoop的核心(大多數MapReduce程式都會為鍵和值型別使用它)

Hadoop中的Writable類的層次結構:

Java基本型別的Writable封裝器

Writable類對所有Java基本型別提供封裝,除char型別(可以儲存在IntWritable中),所有的封裝包含get()和set()方法用於讀取或儲存封裝的值。    定長格式編碼很適合數值在整個值域中分佈非常均勻的情況,例如雜湊函式。但大多數數值變數的分佈都不均勻,一般而言變長格式會更節省空間,變長編碼的另一個優勢是可以在VIntWritable和VLongWritable轉換,所以選擇變長格式之後,便有增長的空間,不必一開始就用8位元組的long表示。

Text型別

是針對UTF-8序列的Writable類。一般認為是String類的Writable等價。但String和Text還是有很本質的區別的,比如長度。String的長度是其所含的char編碼單元的個數,但Text物件的長度卻是其UTF-8編碼的位元組數。另外,String類的indexof()方法返回char編碼單元中的索引位置,Text類的find()方法則返回位元組偏移量。

與String相比,Text 的另一個區別在於它是可變的(與所有Hadoop Writable介面實現類似),可以通過呼叫其中一個set()方法來重用Text例項。Text並不用有足夠的操作String類的API,所以多數情況下要將Text 物件轉換成String物件,這一轉換可以通過toString()方法來實現,new Text("Hadoop").toString()

NullWritable是Writable的特殊型別,它的序列化長度為0,既不從資料流讀取資料,也不向資料流寫入資料,它充當佔位符。

Avro資料檔案詳見12章,可移植,可跨程式語言,被Hadoop生態系統的各元件廣為支援,因此被預設為是對二進位制格式的一種比較好的選擇。

map檔案、Avro檔案和順序檔案都是面向行的格式,每一行的值在檔案中連續儲存。