Hadoop I/O操作原理整理
I/O操作中的資料檢查
校驗和方式是檢查資料完整性的重要方式。一般會通過對比新舊校驗和來確定資料情況,如果兩者不同則說明資料已經損壞。比如,在傳輸資料前生成了一個校驗和,將資料傳輸到目的主機時再次計算校驗和,如果兩次的校驗結果不同,則說明資料已經損壞。因為Hadoop採用HDFS作為預設的檔案系統,因此具有兩方面的資料完整性。
1、本地檔案I/O的檢查
本地檔案系統的資料完整性由客戶端負責,重點是在儲存和讀取檔案時進行校驗和的處理。每當Hadoop建立檔案a時,Hadoop就會同時在同一資料夾下建立隱藏檔案a.crc,這個檔案記錄了檔案a的校驗和。針對資料檔案的大小,每512位元組Hadoop就會生成一個32位的校驗和(4位元組)。
2、對HDFS的I/O資料進行檢查
DataNode接收資料後,儲存資料前。它接收資料一般有兩種情況:一是使用者從客戶端上傳資料;二是DataNode從其他DataNode上接收資料。Hadoop不會在資料每流動到一個DataNode時都檢查校驗和,它只會在資料流動到最後一個節點時檢驗校驗和。
3、在MapReduce程式中使用壓縮
設定Map處理後資料的壓縮程式碼示例如下:
JobConf conf = new JobConf(); conf.setBoolean("mapred.compree.map.output",true); //設定output輸出壓縮 conft.setBoolean("mapred.output.compress",true); conf.setClass("mapred.output.compression.codec",GzipCodec.class,CompressionCodec.class);
4、資料的I/O中序列化操作
序列化是將物件轉化為位元組流的方法,或者說用位元組流描述物件的方法。與序列化相對的是反序列化,反序列化是將位元組流轉化為物件的方法。序列化有兩個目的:程序間通訊;資料永續性儲存。
Hadoop採用RPC來實現程序間通訊,一般而言,RPC的序列化機制有以下特點:
緊湊:緊湊的格式可以充分利用頻寬,加快傳輸速度。
快速:能減少序列化和反序列化的開銷,這會有效減少程序間通訊的時間。
可擴充套件:可以逐步改變。
在Hadoop中,並沒有採用JAVA提供的序列化機制,而是自己重新寫了一個序列化機制Writables。Writables具有緊湊、快速的優點。但不易拓展。
Text
這是Hadoop中對string型別的重寫,但是又與其有一些不同。Text使用標準的UTF-8編碼,同時Hadoop使用變長型別VInt來儲存字串,其儲存上線是2GB。Text型別與String型別的主要差別在於:
1、 Stirng的長度定義為String包含的字元個數;Text的長度定義為UTF-8編碼的位元組數。
2、String內的indexOf()方法返回的是char型別字元的索引。Text的find()方法返回的是位元組偏移量。
3、String的charAt()方法返回的是指定位置的char字元;而Text的charAT()方法需要指定偏移量。
SequenceFile類
SequenceFile記錄的是key/value對的列表,是序列化之後的二進位制檔案,因此是不能直接檢視的。可通過:hadoop fs -text mySequenceFile檢視
參考:
《Hadoop實戰》
https://yq.aliyun.com/articles/609033?spm=a2c4e.11153940.blogcont3487.10.6a6539aabWg8uO