問題導讀
1.什麼是SequenceFile?
2.如何 經過 源碼實現SequenceFile壓縮?
3.SequenceFile格式壓縮有什麼優勢和缺點?
1.SequenceFile是什麼
1.1 SequenceFile概述算法
1.1.sequenceFile文件是Hadoop用來存儲二進制形式的<Key,Value>對而設計的一種平面文件(Flat File)。apache
1.2.能夠把SequenceFile當作是一個容器,把全部的文件打包到SequenceFile類中能夠高效的對小文件進行存儲和處理。數組
1.3.SequenceFile文件並不按照其存儲的Key進行排序存儲,SequenceFile的內部類Writer提供了append功能。app
1.4.SequenceFile中的Key和Value能夠是任意類型Writable或者是自定義Writable。oop
1.5.在存儲結構上,SequenceFile主要由一個Header後跟多條Record組成,Header主要包含了Key classname,value classname,存儲壓縮算法,用戶自定義元數據等信息,此外,還包含了一些同步標識,用於快速定位到記錄的邊界。每條Record以鍵值對的方式進行存儲,用來表示它的字符數組能夠一次解析成:記錄的長度、Key的長度、Key值和value值,而且Value值的結構取決於該記錄是否被壓縮。編碼
1.2:SequenceFile支持數據壓縮spa
2.1.SequenceFIle的內部格式取決因而否啓用壓縮,若是是壓縮,則又能夠分爲記錄壓縮和塊壓縮。設計
2.2.有一下三種類型的壓縮:對象
A.無壓縮類型:若是沒有啓用壓縮(默認設置)那麼每一個記錄就由它的記錄長度(字節數)、鍵的長度,鍵和值組成。長度字段爲4字節。blog
B.記錄壓縮類型:記錄壓縮格式與無壓縮格式基本相同,不一樣的是值字節是用定義在頭部的編碼器來壓縮。注意:鍵是不壓縮的。下圖爲記錄壓縮:
C.塊壓縮類型:塊壓縮一次壓縮多個記錄,所以它比記錄壓縮更緊湊,並且通常優先選擇。當記錄的字節數達到最小大小,纔會添加到塊。該最小值由io.seqfile.compress.blocksize中的屬性定義。默認值是1000000字節。格式爲記錄數、鍵長度、鍵、值長度、值。下圖爲塊壓縮:
1.3:優缺點
SequenceFile優勢:
A.支持基於記錄(Record)或塊(Block)的數據壓縮。
B.支持splitable,可以做爲MapReduce的輸入分片。
C.修改簡單:主要負責修改相應的業務邏輯,而不用考慮具體的存儲格式。
SequenceFile的缺點
A.須要一個合併文件的過程,且合併後的文件不方便查看。
2.SequenceFile類解析
SequenceFile類位於org.apache.hadoop.io包內,類結構以下:
3.讀寫SequenceFile源碼實例
寫過程
一、建立Configuration
二、獲取FileSystem
三、建立文件輸出路徑Path
四、調用SequenceFile.createWriter獲得SequenceFile.Writer對象
五、調用SequenceFile.Writer.append追加寫入文件
六、關閉流 3
例子以下: