歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Hadoop的壓縮算法實例及壓縮算法選取

Hadoop的壓縮算法實例及壓縮算法選取

日期:2017/3/1 9:28:48   编辑:Linux編程

常見數據壓縮算法壓縮

文件壓縮主要有兩個好處,一是減少了存儲文件所占空間,另一個就是為數據傳輸提速。在Hadoop大數據的背景下,這兩點尤為重要,那麼我現在就先來了解下hadoop中的文件壓縮。hadoop裡支持很多種壓縮格式,我們看一個表格:

LZO和LZ4算法已經不在Hadoop1.x中使用了。

1、DEFLATE是同時使用了LZ77與哈夫曼編碼的一個無損數據壓縮算法,源代碼可以在zlib庫中找到。gzip是以DEFLATE算法為基礎擴展出來的一種算法。
2、壓縮算法都是空間和時間的轉換,更快壓縮時間還是更小的壓縮比。可以通過參數來指定,-1意味著速度,-9意味著空間。
拿gzip做個例子,下面就意味著更快速的壓縮:gzip -1 file
3、gzip在時間和空間上的比較適中,bzip2壓縮比gzip更有效,但是速度更慢。bzip2的解壓速度比它的壓縮速度要快。但是和其他壓縮格式相比又是最慢的,但是壓縮效果明顯是最好的。snappy和LZ4的解壓速度比LZO好很多。
4、splittable表示壓縮格式是否可以被分割,也就是說是否支持隨機讀。壓縮數據是否能被mapreduce使用,壓縮數據是否能被分割就很關鍵了。
目前在Hadoop中用得比較多的有lzo,gzip,snappy,bzip2這4種壓縮格式。下面是4種壓縮格式的特征的比較

Codec實現類

org.apache.hadoop.io.compress
CompressionCodec是壓縮和解壓縮的接口。以下是該接口的實現類。

CompressionCodec方法
CompressionCodec有兩個方法用來壓縮和解壓
壓縮:通過createOutputStream(OutputStream out)方法獲得CompressionOutputStream對象
解壓:通過createlnputStream(InputStream in)方法獲得Compressionlnputstream對象

編寫下面的例子進行比較
dd:用指定大小的塊拷貝一個文件,並在拷貝的同時進行指定的轉換。

拷貝生成一個512M的文件
[root@master liguodong]#  dd if=/dev/zero of=data bs=1024k count=512
記錄了512+0 的讀入
記錄了512+0 的寫出
536870912字節(537 MB)已復制,0.557151 秒,964 MB/秒
[root@master liguodong]# ll data
-rw-r--r-- 1 root root 536870912 6月   5 19:11 data
[root@master liguodong]# pwd
/liguodong
[root@master liguodong]# ls
codec.jar  data  dir  jni
package Compress;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionOutputStream;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.util.ReflectionUtils;

public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1、配置  
        Configuration configuration = new Configuration();

        Job job = Job.getInstance(configuration, "Codec");  
        //2、打包運行必須執行的方法
        job.setJarByClass(Test.class);

        //String codecClassName = "org.apache.hadoop.io.compress.BZip2Codec";
        String codecClassName = "org.apache.hadoop.io.compress.GzipCodec";
        Class<?> clsClass = Class.forName(codecClassName);


        CompressionCodec codec = (CompressionCodec)
                ReflectionUtils.newInstance(clsClass, configuration);
        String inputFile = "/liguodong/data";

        String outFile = inputFile + codec.getDefaultExtension();//獲得默認擴展名

        FileOutputStream fileOut = new FileOutputStream(outFile);
        CompressionOutputStream out = codec.createOutputStream(fileOut);
        FileInputStream in = new FileInputStream(inputFile);        
        IOUtils.copyBytes(in, out, 4096 ,false);
        in.close();
        out.close();    
    }
}

打成jar包:codec.jar
運行

[root@master liguodong]# yarn jar codec.jar
15/06/05 19:48:04 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
[root@master liguodong]# ls
codec.jar  data  data.bz2  data.gz  dir  gzipcodec.jar  jni
比較
[root@master liguodong]# ll
總用量 524824
-rw-r--r-- 1 root root 536870912 6月   5 19:11 data
-rw-r--r-- 1 root root       402 6月   5 19:48 data.bz2
-rw-r--r-- 1 root root    521844 6月   5 20:17 data.gz

怎麼選擇壓縮算法?

1、用一些包含了壓縮並且支持splittable的文件格式,比如SequenceFile,RCFile或者Avro文件。
2、使用提供splittable的壓縮格式,比如,bzip2和索引後可以支持splittable的lzo。
3、提前把文件分成幾個塊,每個塊單獨壓縮,這樣就無需考慮splittable的問題了。
4、不要壓縮文件,以不支持splittable的壓縮格式存儲一個很大的數據文件是不合適的,非本地處理效率會非常之低。

更多Hadoop相關信息見Hadoop 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=13

Copyright © Linux教程網 All Rights Reserved