1. 程式人生 > >Hadoop資料壓縮及自定義

Hadoop資料壓縮及自定義

Hadoop資料壓縮
    MR操作過程中進行大量資料傳輸。

    壓縮技術能夠有效的減少底層儲存(HDFS)讀寫位元組數。
    壓縮提高了網路頻寬和磁碟空間的效率。

    資料壓縮能夠有效的節省資源!

    壓縮是MR程式的優化策略!

    通過壓縮編碼對mapper或者reducer資料傳輸進行資料的壓縮,以減少磁碟IO。

壓縮的基本原則
    1、運算密集型任務少用壓縮
    2、IO密集型的任務,少用壓縮

MR支援的壓縮編碼
    壓縮格式    hadoop是否自帶?    檔案拓展名    是否可以切分

    DEFAULT    是                 .deflate     否
    Gzip    是                 .gz         否
    bzip2     是                 .bz2         是
    LZO     否                 .lzo         是
    Snappy     否                 .snappy     否

編碼/解碼器
    DEFAULT     org.apache.hadoop.io.compress.DefaultCodeC
    Gzip         org.apache.hadoop.io.compress.GzipCodeC
    bzip2         org.apache.hadoop.io.compress.BZip2CodeC
    LZO.         com.hadoop.compression.lzo.LzoCodeC
    Snappy         org.apache.hadoop.io.compress.SnappyCodeC

壓縮效能
    壓縮演算法    原始檔案大小    壓縮檔案大小    壓縮速度    解壓速度
    gzip     8.3G     1.8G     17.5MB/s     58MB/s
    bzip2     8.3G     1.1G     2.4MB/s     9.5MB/s
    LZO     8.3G     2.9G     49.3MB/s     74.6MB/s


hadoop壓縮使用方式
    1、在Driver類中mapper端(Job.getInstance()下邊)
        //開啟map端的輸出壓縮
        conf.setBoolean("mapreduce.map.output.compress","true");
        //設定壓縮方式
        conf.setClass("mapreduce.map.output.compress.codec",DefaultCodec.class, CompressionCodec.class);
        conf.setClass("mapreduce.map.output.compress.codec",BZip2Codec.class, CompressionCodec.class);

    2、reduce端
        //reduce端輸出資料型別下
        //開啟reduce端的輸出壓縮
        FileOutputFormat.setCompressOutput(job,true);
        //設定壓縮方式
        FileOutputFormat.setOutputCompressClass(job, DefaultCodec.class);//預設方式
        FileOutputFormat.setOutputCompressClass(job, BZip2Codec.class);
        FileOutputFormat.setOutputCompressClass(job, GzipCodec.class);
壓縮工具自定義
  

 public class TextCompress {
        main{
            Compress("C://a.txt","org.apache.hadoop.io.compress.GzipCodec");

        }
        //測試壓縮方法
        private static void Compress(String fileName, String method) throws Exception{
            //1、獲取輸入流
            FileInputStream fis = new FileInputStream(new File(fileName));

            Class cName = Class.forName(method);

            CompressionCodec codec = (CompressionCodec)ReflectionUtils.newInstance(cName, new Configuration());

            //2、輸出流
            FileOutputStream fos = new FileOutputStream(new File(fileName + codec.getDefaultExtension()));

            //3、建立壓縮輸出流
            CompressionOutputStream cos = codec.createOutputStream(fos);

            //4、流的對考
            IOUtils.copyBytes(fis, cos, 1024*1024*2, false);

            //5、關閉資源
            fis.close();
            fos.close();
            cos.close();

        }
    }