压缩的好处和坏处
压缩的优点:
以减少磁盘 IO、减少磁盘存储空间
压缩的
缺点 :增加 CPU开销
压缩原则
MapReduce支持的压缩编码
压缩算法对比介绍
压缩格式 | Hadoop 是否自带 | 算法 | 文件扩展名 | 是否可切片 | 换成压缩格式后,原来的程序是否需要修改 |
---|---|---|---|---|---|
DEFLATE | 是,直接使用 | DEFLATE | .deflate | 否 | 和文本处理一样,不需要修改 |
Gzip | 是,直接使用 | DEFLATE | .gz | 否 | 和文本处理一样,不需要修改 |
bzip2 | 是,直接使用 | bzip2 | .bz2 | 是 | 和文本处理一样,不需要修改 |
LZO | 否,需安装 | LZO | .lzo | 是 | 需要建索引,还需指定输入格式 |
Snappy | 是,直接使用 | Snappy | .Snappy | 否 | 和文本处理一样,不需要修改 |
压缩性能的比较
压缩方式选择时重点考虑:压缩 /解压缩速度、压缩率(压缩后存储大小)、压缩后是否可以支持切片
压缩可以在MapReduce 作用的任意阶段启用
输入端采用压缩
Mapper输出采用压缩
企业开发中如何选择:为了减少MapTask和ReduceTask之间的网络IO。重点考虑压缩和解压缩快的LZO、Snappy
Reducer输出采用压缩
为了支持多种压缩/解压缩算法,Hadoop 引入了编码/解码器
要在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 (在 mapredsite.xml 中配置) | org.apache.hadoop.io.compress.DefaultCodec | mapper输出 | 企业多 使用 LZO 或S nappy 编解码器在此阶段压缩数据 |
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 |
Map输出 端采用压缩:
在Driver类中添加:
// 开启 map 端输出压缩
config.setBoolean("mapreduce.map.output.compress", true);
// 设置 map 端输出压缩方式
config.setClass("mapreduce.map.output.compress.codec",BZip2Codec.class , CompressionCodec.class);
Reduce输出 端采用压缩:
在Driver类中添加:
// 设置 reduce 端输出压缩开启
FileOutputFormat.setCompressOutput(job, true);
// 设置压缩的方式
//FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);
FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);
//FileOutputFormat.setOutputCompressorClass(job, DefaultCodec.class);