發布時間: 2023-04-06 17:48:36
Hadoop是為處理大型文件所設計的,在小文件的處理上效率較低,然而在實際生產環境中,需要Hadoop處理的數據往往存放在海量小文件中。因此,高效處理小文件對于提高Hadoop的性能至關重要。這里的小文件是指小于 HDFS中一個塊(Block)大小的文件。
Hadoop處理小文件有兩種方法:壓縮小文件和創建序列化文件。
Hadoop在存儲海量小文件時,需要頻繁訪問各節點,非常耗費資源。如果某個節點上存放1000萬個600Byte大小的文件,那么該節點上至少需要提供4 GB的內存。為了節省資源,海量小文件在存儲到HDFS之前,需要進行壓縮。
1.Hadoop壓縮格式
Hadoop進行文件壓縮的作用:減少存儲空間占用,降低網絡負載。這兩點對于Hadoop存儲和傳輸海量數據非常重要。Hadoop常用的壓縮格式,如表所示。
2.編解碼器
編解碼器(Codec)是指用于壓縮和解壓縮的設備或計算機程序。Hadoop中的編壓縮解碼器主要是通過Hadoop的一些類來實現的, 如表所示。
對于LZO壓縮格式,Hadoop實現壓縮編解碼器的類不在org.apache.hadoop.io.compress包中,可前往GitHub官方網站下載。
3.壓縮格式的效率
對上述6種壓縮格式的壓縮效率、解壓效率、壓縮占比進行測試,測試結果如下。
壓縮效率 (由高到低): Snappy > LZ4 > LZO > Gzip > DEELATE > Bzip2
解壓效率 (由高到低): Snappy > LZ4 > LZO > Gzip > DEELATE > Bzip2
壓縮占比 (由小到大): Bzip2 < DEELATE < Gzip < LZ4 < LZO < Snappy
在實際生產環境中,可以參考以上的測試結果,根據業務需要做出恰當的選擇。
創建序列文件主要是指創建SequenceFile(順序文件)和MapFile(映射文件)。
1.SequenceFile
(1)SequenceFile簡介。
SequenceFile是存儲二進制鍵值(Key-Value)對的持久數據結構。通過SequenceFile可以將若干小文件合并成一個大的文件進行序列化操作,實現文件的高效存儲和處理。
(2)SequenceFile的內部結構
SequenceFile由一個文件頭(Header)和隨后的一條或多條記錄(Record)組成(如圖所示)。Header的前三個字節SEQ(順序文件代碼),隨后的一個字節是SequenceFile的版本號。Header還包括Key類的名稱、Value類的名稱、壓縮細節、Metadata(元數據)、Sync Marker(同步標識)等。Sync Marker的作用在于可以讀取SequenceFile任意位置的數據。
記錄有無壓縮、記錄壓縮、塊壓縮三種壓縮形式,默認為無壓縮。
① 當采用無壓縮(No Compress)時,每條記錄由記錄長度、鍵長度、鍵、值組成,將鍵與值序列化寫入SequenceFile。
② 當采用記錄壓縮(Record Compress)時,只壓縮值,不壓縮鍵,其他方面與無壓縮類似。
③ 塊壓縮(Block Compress)利用記錄間的相似性進行壓縮,一次性壓縮多條記錄,比單條記錄的壓縮方法壓縮效率更高。
當采用塊壓縮時,多條記錄被壓縮成默認1MB的數據塊,每個數據塊之前插入同步標識。數據塊由表示數據塊字節數的字段和壓縮字段組成,其中,壓縮字段包括鍵長度、鍵、值長度、值。
下一篇: 軟考是什么?應該怎么選擇方向?