Hadoop序列化文件SequenceFile主要用於解決大量小文件問題,SequenceFile是Hadoop API提供的一種二進制文件支持。這種二進制文件直接將<key,value>對序列化到文件中,一般對小文件可以使用這種文件合並,即將文件名作為key,文件內容作為value序列化到大文件中。
理解點:
1、二進制數據格式,在hadoop上進行mr任務時使用,一般是中間過程mr的輸入輸出數據
2、有一定的格式:頭部+內容。頭部標示SEQ
3、可通過read讀取,
${JAVA_HOME}/bin/java -cp ${HADOOP_LIB}/hadoop-2-core.jar:${HADOOP_LIB}/commons-logging-1.0.4.jar:${bin} sequencefile.SequenceFileReader $fileName
4、讀寫會用到用到commons-logging-1.0.4.jar hadoop-2-core.jar sequencefile.env sequencefile.jar 等
好處:
1)支持壓縮,且可定制為基於Record或Block壓縮(Block級壓縮性能較優)
2)本地化任務支持:因為文件可以被切分,因此MapReduce任務時數據的本地化情況應該是非常好的。
3)難度低:因為是Hadoop框架提供的API,業務邏輯側的修改比較簡單。
壞處:需要一個合並文件的過程,且合並後的文件將不方便查看。
SequenceFile 是一個由二進制序列化過的key/value的字節流組成的文本存儲文件,它可以在map/reduce過程中的input/output 的format時被使用。在map/reduce過程中,map處理文件的臨時輸出就是使用SequenceFile處理過的。
SequenceFile分別提供了讀、寫、排序的操作類。
SequenceFile的操作中有三種處理方式:
1) 不壓縮數據直接存儲。 //enum.NONE
2) 壓縮value值不壓縮key值存儲的存儲方式。//enum.RECORD
3)key/value值都壓縮的方式存儲。//enum.BLOCK
SequenceFile提供了若干Writer的構造靜態獲取。
//SequenceFile.createWriter();
SequenceFile.Reader使用了橋接模式,可以讀取SequenceFile.Writer中的任何方式的壓縮數據。
三種不同的壓縮方式是共用一個數據頭,流方式的讀取會先讀取頭字節去判斷是哪種方式的壓縮,然後根據壓縮方式去解壓縮並反序列化字節流數據,得到可識別的數據。
流的存儲頭字節格式:
Header:
*字節頭”SEQ”, 後跟一個字節表示版本”SEQ4”,”SEQ6”.//這裡有點忘了 不記得是怎麼處理的了,回頭補上做詳細解釋
*keyClass name
*valueClass name
*compression boolean型的存儲標示壓縮值是否轉變為keys/values值了
*blockcompression boolean型的存儲標示是否全壓縮的方式轉變為keys/values值了
*compressor 壓縮處理的類型,比如我用Gzip壓縮的Hadoop提供的是GzipCodec什麼的..
*元數據 這個大家可看可不看的
所有的String類型的寫操作被封裝為Hadoop的IO API,Text類型writeString()搞定。
未壓縮的和只壓縮values值的方式的字節流頭部是類似的:
*Header
*RecordLength記錄長度
*key Length key值長度
*key 值
*是否壓縮標志 boolean
*value
更多Hadoop相關信息見Hadoop 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=13