Hadoop中的壓縮(1) 概述與例項

2021-09-23 17:33:24 字數 2479 閱讀 6860

檔案壓縮主要有兩個好處,一是減少了儲存檔案所佔空間,另乙個就是為資料傳輸提速。在hadoop大資料的背景下這兩點尤為重要。

hadoop裡支援很多種壓縮格式:

deflate是同時使用了lz77演算法與哈夫曼編碼(huffman coding)的乙個無損資料壓縮演算法,源**可以在zlib庫中找到。gzip是以deflate演算法為基礎擴充套件出來的一種演算法。

壓縮演算法

原始檔案大小

壓縮後的檔案大小

壓縮速度

解壓縮速度

gzip  

8.3gb  

1.8gb

17.5mb/s

58mb/s

bzip2

8.3gb

1.1gb

2.4mb/s

9.5mb/s

lzo-bset

8.3gb

2gb4mb/s

60.6mb/s

lzo8.3gb

2.9gb

49.3mb/s

74.6mb/s

所有的壓縮演算法都是空間和時間的轉換,更快壓縮時間還是更小的壓縮比,可以通過引數來指定,-1意味著速度,-9意味著空間。拿gzip做個例子,下面就意味著更快速的壓縮:gzip -1 file

舉例乙個未壓縮的檔案有1gb大小,hdfs預設的block大小是64mb,那麼這個檔案就會被分為16個block作為mapreduce的輸入,每乙個單獨使用乙個map任務。若該檔案是已經使用gzip壓縮的呢,若分成16個塊,每個塊做成乙個輸入,顯然是不合適的,因為gzip壓縮流的隨即讀是不可能的。實際上,當mapreduce處理壓縮格式的檔案的時候它會認識到這是乙個gzip的壓縮檔案,而gzip又不支援隨即讀,它就會把16個塊分給乙個map去處理,這裡就會有很多非本地處理的map任務,整個過程耗費的時間就會相當長。

lzo壓縮格式也會是同樣的問題,但是通過使用hadoop lzo庫的索引工具以後,lzo就可以支援splittable。bzip2也是支援splittable的。

詳見hadoop-2.5.2-src原始碼中的fileinputformat類中的getsplits方法

if (issplitable(fs, path)) 

if (bytesremaining != 0)

} else

codec其實就是coder和decoder兩個單詞的詞頭組成的縮略詞。compressioncodec定義了壓縮和解壓介面,所以又叫編碼解碼器。為了支援多種壓縮/解壓縮演算法,hadoop引入了編碼/解碼器,如下表所示

壓縮格式

對應的編碼/解碼器

deflate

org.apache.hadoop.io.compress.defaultcodec

gzip

org.apache.hadoop.io.compress.gzipcodec

bzip

org.apache.hadoop.io.compress.bzip2codec

public class testcompress 

/*** 壓縮方法

* @param filename 待壓縮的檔案路徑

* @param method 壓縮方法名

*/public static void compress(string filepath, string method)

throws classnotfoundexception, ioexception

/*** 解壓方法

* @param filename 待解壓的檔案

*/public static void decompres(string filepath) throws filenotfoundexception,

ioexception

// 獲取輸入流

inputstream cin = codec

.createinputstream(new fileinputstream(filepath));

// 輸出檔案

file fout = new file(filepath + ".decoded");

outputstream out = new fileoutputstream(fout);

ioutils.copybytes(cin, out, 1024 * 1024 * 5, false);

system.out.println("decompres success");

cin.close();

out.close();

}}

hadoop中的檔案壓縮

1 減少磁碟的儲存空間 2 減少磁碟io和網路io 3 加快資料傳輸速度 磁碟和網路 如果小檔案多明顯檔案傳輸會明顯降低 1 考慮檔案的壓縮效率 壓縮快慢 2 考慮檔案的壓縮比 解壓快慢 第一點好理解,壓縮的快肯定好 第二點是壓縮比,舉例現在有乙個10g的檔案,一種壓縮演算法能把他壓縮成1g,其他壓...

Hadoop中的壓縮和解壓縮

壓縮就是通過某種演算法,將原始的檔案變下,使原始的檔案變小。解壓就是將壓縮後的檔案變成原始檔案的過程。1.hadoop當中哪些過程需要用到壓縮和解壓?map端 壓縮後的原始檔案首先切成塊,然後再解壓作為輸入檔案輸入給map端,等map端將資料處理完成後然後再壓縮,放在硬碟中。shuffle過程 壓縮...

《卷積神經網路的壓縮與加速》概述

有四種常用方法 網路剪枝,模型量化,低秩估計,模型蒸餾。網路剪枝主要有下列幾種方法 filter level剪枝 通過刪除filter來減少通道數量 group level剪枝即kernel size縮小 如將33變成32,或者3 3變成固定形狀包含若干個0的新核 稀疏卷積的方法 fine grai...