目录
- 一、压缩概述
- 优缺点
- 原则
- 二、MR 支持的压缩编码
- 三、压缩方式选择
- Gzip压缩
- Bzip2 压缩
- Lzo压缩
- Snappy压缩
- 压缩位置选择
- 四、压缩参数配置
- 五、压缩案例
- 六、数据清洗ETL
一、压缩概述
优缺点
优点:减少磁盘IO、减少磁盘存储空间;
缺点:增加CPU开销。
原则
- 运算密集型的job,少用压缩;
- IO密集型的job,多用压缩。
二、MR 支持的压缩编码
- 压缩算法对比
- 压缩性能比较
三、压缩方式选择
压缩方式选择时重点考虑:压缩/解压缩速度、压缩率(压缩后存储大小)、压缩后是否可以支持切片。
Gzip压缩
优点:压缩率比较高;
缺点:不支持 Split;压缩/解压速度一般;
Bzip2 压缩
优点:压缩率高;支持 Split;
缺点:压缩/解压速度慢。
Lzo压缩
优点:压缩/解压速度比较快;支持split;
缺点:压缩率一般;想支持切片需要额外创建索引。
Snappy压缩
优点:压缩和解压缩速度快;
缺点:不支持 Split;压缩率一般;
压缩位置选择
压缩可以在 MapReduce 作用的任意阶段启用。
四、压缩参数配置
- 为了支持多种压缩/解压缩算法,Hadoop 引入了编码/解码器;
- 要在 Hadoop 中启用压缩,可以配置如下参数;
五、压缩案例
对于WordCount案例,Mapper/ Reducer不变,只需修改Driver;
Mapper端压缩:
Configuration conf = new Configuration();
// 开启 map 端输出压缩 conf.setBoolean("mapreduce.map.output.compress", true);
// 设置 map 端输出压缩方式
conf.setClass("mapreduce.map.output.compress.codec",
BZip2Codec.class,CompressionCodec.class);
Reduce 输出端采用压缩:
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);
六、数据清洗ETL
“ETL” 是英文Extract- Transform-Load的缩写,用来描述将数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目前端的过程。ETL一词较常用在数据仓库,但其对象并不限于数据仓库。
在运行核心业务MapReduce程序之前,往往要先对数据进行清洗,清理掉不符合用户要求的数据。清理的过程往往只需要运行Mapper程序,不需要运行Reduce程序。