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