Hadoop IO操作之SequenceFile 和 MapFile
一、SquenceFile
文件中每條記錄是可序列化,可持久化的鍵值對,提供相應的讀寫器和排序器,寫操作根據壓縮的類型分為3種。
---Write 無壓縮寫數據
---RecordCompressWriter記錄級壓縮文件,只壓縮值
---BlockCompressWrite塊級壓縮文件,鍵值采用獨立壓縮方式
在存儲結構上,SequenceFile主要由一個Header後跟多條Record組成,如下圖所示:
前三個字節是一個Bytes SEQ代表著版本號,同時header也包括key的名稱,value class , 壓縮細節,metadata,以及Sync markers。Sync markers的作用在於可以讀取任意位置的數據。
在recourds中,又分為是否壓縮格式。當沒有被壓縮時,key與value使用Serialization序列化寫入SequenceFile。當選擇壓縮格式時,record的壓縮格式與沒有壓縮其實不盡相同,除了value的bytes被壓縮,key是不被壓縮的。
當保存的記錄很多時候,可以把一串記錄組織到一起同一壓縮成一塊。
在Block中,它使所有的信息進行壓縮,壓縮的最小大小由配置文件中,io.seqfile.compress.blocksize配置項決定。
二、MapFile
MapFile是排序後的SequenceFile,通過觀察其目錄結構可以看到MapFile由兩部分組成,分別是data和index。
index作為文件的數據索引,主要記錄了每個Record的key值,以及該Record在文件中的偏移位置。在MapFile被訪問的時候,索引文件會被加載到內存,通過索引映射關系可迅速定位到指定Record所在文件位置,因此,相對SequenceFile而言,MapFile的檢索效率是高效的,缺點是會消耗一部分內存來存儲index數據。
需註意的是,MapFile並不會把所有Record都記錄到index中去,默認情況下每隔128條記錄存儲一個索引映射。當然,記錄間隔可人為修改,通過MapFIle.Writer的setIndexInterval()方法,或修改io.map.index.interval屬性;
另外,與SequenceFile不同的是,MapFile的KeyClass一定要實現WritableComparable接口,即Key值是可比較的。
缺點:
1.文件不支持復寫操作,不能向已存在的SequenceFile(MapFile)追加存儲記錄
2.當write流不關閉的時候,沒有辦法構造read流。也就是在執行文件寫操作的時候,該文件是不可讀取的
SequenceFile文件是用來存儲key-value數據的,但它並不保證這些存儲的key-value是有序的,而MapFile文件則可以看做是存儲有序key-value的SequenceFile文件。MapFile文件保證key-value的有序(基於key)是通過每一次寫入key-value時的檢查機制,這種檢查機制其實很簡單,就是保證當前正要寫入的key-value與上一個剛寫入的key-value符合設定的順序,但是,這種有序是由用戶來保證的,一旦寫入的key-value不符合key的非遞減順序,則會直接報錯而不是自動的去對輸入的key-value排序。
SequenceFile轉換為MapFile
mapFile既然是排序和索引後的SequenceFile那麽自然可以把SequenceFile轉換為MapFile使用mapFile.fix()方法把一個SequenceFile文件轉換成MapFile。
Hadoop IO操作之SequenceFile 和 MapFile