在大數據環境下,數據的存儲也是個問題。如何存儲大量的文件和計算一直是人們所關注的。因爲hadoop的分佈式存儲和計算模型,其實瓶頸在於IO而非傳統的CPU,這樣壓縮存儲非常合適。hadoop提供了內置壓縮格式和支持第三方的本地壓縮算法庫。
所有的壓縮算法都是空間和時間的轉換,更快壓縮時間還是更小的壓縮比。
在壓縮算法中壓縮後的數據能否分隔是一個非常重要的因素。舉例來說,一個未壓縮的文件有1GB大小,hdfs默認的block大小是64MB,那麼這個文件就會被分爲16個block作爲mapreduce的輸入,每一個單獨使用一個map任務。如果這個文件是已經使用gzip壓縮的呢,如果分成16個塊,每個塊做成一個輸入,顯然是不合適的,因爲gzip壓縮流的隨即讀是不可能的。實際上,當mapreduce處理壓縮格式的文件的時候它會認識到這是一個gzip的壓縮文件,而gzip又不支持隨即讀,它就會把16個塊分給一個map去處理,這裏就會有很多非本地處理的map任務,整個過程耗費的時間就會相當長。(以前不理解HDFS是如何存儲壓縮文件的,其實是先壓縮,然後把壓縮後的文件按照block塊大小寫入到HDFS,所以纔會存在壓縮算法是否支持分隔的區別。如果壓縮算法支持分隔則需要每個block塊有元數據信息,或者建立block塊的索引)。
也可以把壓縮後的文件上傳到HDFS,hadoop會識別壓縮後的文件後綴來判斷是否支持可分隔來支持分佈式處理。
-----------------------------------我是分割線---------------------------------------------------------------------
下面介紹下hadoop常用的四種壓縮格式的優缺點和使用場景。
1 gzip壓縮
優點:壓縮率比較高,而且壓縮/解壓速度也比較快;hadoop本身支持,在應用中處理gzip格式的文件就和直接處理文本一樣;有hadoop native庫;大部分linux系統都自帶gzip命令,使用方便。
缺點:不支持split。
應用場景:當每個文件壓縮之後在130M以內的(1個塊大小內),都可以考慮用gzip壓縮格式。譬如說一天或者一個小時的日誌壓縮成一個gzip文件,運行mapreduce程序的時候通過多個gzip文件達到併發。hive程序,streaming程序,和java寫的mapreduce程序完全和文本處理一樣,壓縮之後原來的程序不需要做任何修改。
2 lzo壓縮
優點:壓縮/解壓速度也比較快,合理的壓縮率;支持split,是hadoop中最流行的壓縮格式;支持hadoop native庫;可以在linux系統下安裝lzop命令,使用方便。
缺點:壓縮率比gzip要低一些;hadoop本身不支持,需要安裝;在應用中對lzo格式的文件需要做一些特殊處理(爲了支持split需要建索引,還需要指定inputformat爲lzo格式)。
應用場景:一個很大的文本文件,壓縮之後還大於200M以上的可以考慮,而且單個文件越大,lzo優點越越明顯。
3 snappy壓縮
優點:高速壓縮速度和合理的壓縮率;支持hadoop native庫。
缺點:不支持split;壓縮率比gzip要低;hadoop本身不支持,需要安裝;linux系統下沒有對應的命令。
應用場景:當mapreduce作業的map輸出的數據比較大的時候,作爲map到reduce的中間數據的壓縮格式;或者作爲一個mapreduce作業的輸出和另外一個mapreduce作業的輸入。
4 bzip2壓縮
優點:支持split;具有很高的壓縮率,比gzip壓縮率都高;hadoop本身支持,但不支持native;在linux系統下自帶bzip2命令,使用方便。
缺點:壓縮/解壓速度慢;不支持native。
應用場景:適合對速度要求不高,但需要較高的壓縮率的時候,可以作爲mapreduce作業的輸出格式;或者輸出之後的數據比較大,處理之後的數據需要壓縮存檔減少磁盤空間並且以後數據用得比較少的情況;或者對單個很大的文本文件想壓縮減少存儲空間,同時又需要支持split,而且兼容之前的應用程序(即應用程序不需要修改)的情況。
最後用一個表格比較上述4種壓縮格式的特徵(優缺點):
壓縮格式 | split | native | 壓縮率 | 速度 | 是否hadoop自帶 | linux命令 | 換成壓縮格式後,原來的應用程序是否要修改 |
---|---|---|---|---|---|---|---|
gzip | 否 | 是 | 很高 | 比較快 | 是,直接使用 | 有 | 和文本處理一樣,不需要修改 |
lzo | 是 | 是 | 比較高 | 很快 | 否,需要安裝 | 有 | 需要建索引,還需要指定輸入格式 |
snappy | 否 | 是 | 比較高 | 很快 | 否,需要安裝 | 沒有 | 和文本處理一樣,不需要修改 |
bzip2 | 是 | 否 | 最高 | 慢 | 是,直接使用 | 有 | 和文本處理一樣,不需要修改 |