1. 程式人生 > 實用技巧 >hadoop SequenceFile 檔案寫入及各式分析

hadoop SequenceFile 檔案寫入及各式分析

hadoopSequenceFile 是一個由二進位制形式key/value的位元組流組成的儲存檔案,SequenceFile可壓縮可切分,非常適合hadoop檔案儲存特性,SequenceFile的寫入由SequenceFile.Writer來實現,根據壓縮型別SequenceFile.Writer又派生出兩個子類SequenceFile.BlockCompressWriter和SequenceFile.RecordCompressWriter,壓縮方式由SequenceFile類的內部列舉類CompressionType來表示,定義了三種方式
不採用壓縮:
CompressionType.NONE

記錄級別的壓縮:
CompressionType.RECORD
塊級別的壓縮:
CompressionType.BLOCK
使用時可以通過引數:io.seqfile.compression.type=[NONE|RECORD|BLOCK]來指定具體的壓縮方式.

寫入SequenceFile時通過建立一個SequenceFile.Writer來實現SequenceFile.Writer writer = SequenceFile.createWriter然後呼叫writer.append(key, value);方法進行資料寫入,根據指定的壓縮方式不同,寫入時SequenceFile組織內部結構也有所不同.

SequenceFile Header在三種壓縮方式都是相同的,在建立SequenceFile.Writer物件時在建構函式中依次呼叫

  1. initializeFileHeader();
  2. writeFileHeader();
  3. finalizeFileHeader();

來完成檔案頭的寫入.
SequenceFile檔案頭格式如下:

SequenceFile 內容,根據指定的壓縮方式不同,組織結構也有所不同,當壓縮方式指定為CompressionType.NONE,CompressionType.RECORD時,檔案內容由 同步標記+RECODE 組成,當壓縮方式指定為CompressionType.BLOCK時,檔案內容由 同步標記+BLOCK 組成

同步標記+RECODE:

輸出流會維護一個上次插入同步點時的記錄位置(lastSyncPos,初始為0),每次append(key, value)時都會檢查當前輸出流pos與上次同步點之間的距離是否大於等於SYNC_INTERVAL, 如果是, 就會插入一個同步點(sync)
CompressionType.NONE時 記錄資訊不壓縮
CompressionType.RECORD時 記錄資訊壓縮(單條記錄壓縮)

同步標記+BLOCK:

BlockCompressWriter內部維護keyBuffer,valBuffer,每次append(key, value)時會把key和value物件序列化到keyBuffer和valBuffer, 並判斷keyBuffer和valBuffer相加後的size是否大於等於compressionBlockSize, 如果是則插入一個同步點,並刷出資料流成一個block.
每個block與block之間都會有一個同步點(sync)
一個block內會有多條記錄組成,壓縮是作用在block之上的,比RECODE方式能獲得更好的壓縮比
compressionBlockSize可以通過io.seqfile.compress.blocksize=size引數指定,預設值是1000000