欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hadoop数据压缩及自定义

程序员文章站 2022-05-15 17:50:25
...

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();

        }
    }

 

相关标签: 压缩