zoukankan      html  css  js  c++  java
  • Hadoop——数据压缩

    一、概述

    1)压缩的好处和坏处

    压缩的优点:以减少磁盘IO、减少磁盘存储空间。

    压缩的缺点:增加CPU开销。

    2)压缩原则

    • 运算密集型的Job,少用压缩
    • IO密集型的Job,多用压缩

    二、MR支持的压缩编码

    1)压缩算法对比介绍

    压缩格式

    Hadoop自带?

    算法

    文件扩展名

    是否可切片

    换成压缩格式后,原来的程序是否需要修改

    DEFLATE

    是,直接使用

    DEFLATE

    .deflate

    和文本处理一样,不需要修改

    Gzip

    是,直接使用

    DEFLATE

    .gz

    和文本处理一样,不需要修改

    bzip2

    是,直接使用

    bzip2

    .bz2

    和文本处理一样,不需要修改

    LZO

    否,需要安装

    LZO

    .lzo

    需要建索引,还需要指定输入格式

    Snappy

    是,直接使用

    Snappy

    .snappy

    和文本处理一样,不需要修改

    2)压缩性能的比较

    压缩算法

    原始文件大小

    压缩文件大小

    压缩速度

    解压速度

    gzip

    8.3GB

    1.8GB

    17.5MB/s

    58MB/s

    bzip2

    8.3GB

    1.1GB

    2.4MB/s

    9.5MB/s

    LZO

    8.3GB

    2.9GB

    49.3MB/s

    74.6MB/s

    http://google.github.io/snappy/

    Snappy is a compression/decompression library. It does not aim for maximum compression, or compatibility with any other compression library; instead, it aims for very high speeds and reasonable compression. For instance, compared to the fastest mode of zlib, Snappy is an order of magnitude faster for most inputs, but the resulting compressed files are anywhere from 20% to 100% bigger.On a single core of a Core i7 processor in 64-bit mode, Snappy compresses at about 250 MB/sec or more and decompresses at about 500 MB/sec or more.

    三、压缩方式选择

    压缩方式选择时重点考虑:压缩/解压缩速度、压缩率(压缩后存储大小)、压缩后是否可以支持切片

    3.1 Gzip压缩

    • 优点:压缩率比较高;
    • 缺点:不支持Split;压缩/解压速度一般;

    3.2 Bzip2压缩

    • 优点:压缩率高;支持Split;
    • 缺点:压缩/解压速度慢。

    3.3 Lzo压缩

    • 优点:压缩/解压速度比较快;支持Split;
    • 缺点:压缩率一般;想支持切片需要额外创建索引。

    3.4 Snappy压缩

    • 优点:压缩和解压缩速度快;
    • 缺点:不支持Split;压缩率一般;

    3.5 压缩位置选择

    压缩可以在MapReduce作用的任意阶段启用。

    四、压缩参数配置

    1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器

    压缩格式

    对应的编码/解码器

    DEFLATE

    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.LzopCodec

    Snappy

    org.apache.hadoop.io.compress.SnappyCodec

    2)要在Hadoop中启用压缩,可以配置如下参数

    参数

    默认值

    阶段

    建议

    io.compression.codecs   

    (在core-site.xml中配置)

    无,这个需要在命令行输入hadoop checknative查看

    输入压缩

    Hadoop使用文件扩展名判断是否支持某种编解码器

    mapreduce.map.output.compress(在mapred-site.xml中配置)

    false

    mapper输出

    这个参数设为true启用压缩

    mapreduce.map.output.compress.codec(在mapred-site.xml中配置)

    org.apache.hadoop.io.compress.DefaultCodec

    mapper输出

    企业多使用LZO或Snappy编解码器在此阶段压缩数据

    mapreduce.output.fileoutputformat.compress(在mapred-site.xml中配置)

    false

    reducer输出

    这个参数设为true启用压缩

    mapreduce.output.fileoutputformat.compress.codec(在mapred-site.xml中配置)

    org.apache.hadoop.io.compress.DefaultCodec

    reducer输出

    使用标准工具或者编解码器,如gzip和bzip2

    五、压缩实操案例

    5.1 Map输出端采用压缩

    即使你的MapReduce的输入输出文件都是未压缩的文件,你仍然可以对Map任务的中间结果输出做压缩,因为它要写在硬盘并且通过网络传输到Reduce节点,对其压缩可以提高很多性能,这些工作只要设置两个属性即可,我们来看下代码怎么设置。
    1)给大家提供的Hadoop源码支持的压缩格式有:BZip2Codec、DefaultCodec

    public class WordCountDriver {
    
        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
    
            Configuration conf = new Configuration();
    
            // 开启map端输出压缩
            conf.setBoolean("mapreduce.map.output.compress", true);
    
            // 设置map端输出压缩方式
            conf.setClass("mapreduce.map.output.compress.codec", BZip2Codec.class,CompressionCodec.class);
    
            Job job = Job.getInstance(conf);
    
            job.setJarByClass(WordCountDriver.class);
    
            job.setMapperClass(WordCountMapper.class);
            job.setReducerClass(WordCountReducer.class);
    
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);
    
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
    
            FileInputFormat.setInputPaths(job, new Path(args[0]));
            FileOutputFormat.setOutputPath(job, new Path(args[1]));
    
            boolean result = job.waitForCompletion(true);
    
            System.exit(result ? 0 : 1);
        }
    }

    Mapper保持不变、Reducer保持不变

    5.2 Reduce输出端采用压缩

    public class WordCountDriver {
    
        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
            
            Configuration conf = new Configuration();
            
            Job job = Job.getInstance(conf);
            
            job.setJarByClass(WordCountDriver.class);
            
            job.setMapperClass(WordCountMapper.class);
            job.setReducerClass(WordCountReducer.class);
            
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);
            
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            
            FileInputFormat.setInputPaths(job, new Path(args[0]));
            FileOutputFormat.setOutputPath(job, new Path(args[1]));
            
            // 设置reduce端输出压缩开启
            FileOutputFormat.setCompressOutput(job, true);
    
            // 设置压缩的方式
            FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class); 
    //        FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class); 
    //        FileOutputFormat.setOutputCompressorClass(job, DefaultCodec.class); 
            
            boolean result = job.waitForCompletion(true);
            
            System.exit(result?0:1);
        }
    }
    作者:王陸

    -------------------------------------------

    个性签名:罔谈彼短,靡持己长。做一个谦逊爱学的人!

    本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。鉴于博主处于考研复习期间,有什么问题请在评论区中提出,博主尽可能当天回复,加微信好友请注明原因

  • 相关阅读:
    Assembly Manifest 通俗简易手册
    CruiseControl服务器安装配置
    关于URL编码
    从A到Z来说说Web开发
    通过注册表查看 .NET Framework的版本信息
    云数据存在哪里?
    C#中你可能不知道的8件事(zz)
    用PBKDF2 或BCrypt 来存储密码
    C++编译器什么时候为我们自动生成拷贝构造函数?
    C#中你可能不知道的8件事(zz)
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/15539524.html
Copyright © 2011-2022 走看看