1. 程式人生 > >Hadoop I/O操作原理整理

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