歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Hadoop序列化文件SequenceFile

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

Copyright © Linux教程網 All Rights Reserved