经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 大数据/云/AI » Hadoop » 查看文章
Hadoop的数据压缩
来源:cnblogs  作者:给你一个公主抱  时间:2019/4/8 10:45:41  对本文有异议

一、Hadoop的数据压缩

  1.概述

    在进行MR程序的过程中,在Mapper和Reducer端会发生大量的数据传输和磁盘IO,如果在这个过程中对数据进行压缩处理,可以有效的减少底层存储(HDFS)读写的字节数,,并且通过减少Map和Reduce阶段数据的输入输出来提升MR程序的速度,提高了网络带宽和磁盘空间的效率;

    数据压缩可以有效的节省资源,它是MR程序的优化策略之一;  

    数据压缩会增加cpu的计算负担,但是能很大程度较少磁盘的IO。由于数据压缩占用cpu资源很小,总体还是利大于弊的。

  2.数据压缩使用原则:

    运算密集型的任务尽量少用压缩、IO密集型的任务多用压缩。

  3.MapReduce支持的压缩编码

hadoop中的压缩格式 是否自带 文件的拓展名 是否可以切分
DEFAULT .default
Gzip .gz
bzip2 .bz2
LZO .lzo
Snappy .snappy

  4.编码解码器

DEFAULT org.apache.hadoop.io.compress.DefaultCodeC
Gzip org.apahce.hadoop.io.compress.GzioCodeC
bzop2 org.apache.hadoop.io.compress.bzio2CodeC
LZO com.apache.hadoop.compression.lzoCodeC
Snappy org.apache.hadoop.io.compress.SnappyCodeC

  5.压缩性能

压缩格式 原始文件 压缩后文件 压缩速度 解压速度
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 49MB/s 74.6MB/s

 

 

二 、Hadoop压缩的使用

 

  1.应用在WordCount程序中

   1)在map端对数据进行压缩

    在Driver类中的获取job对象后加入配置信息:

  1. //开启map端的输入压缩
  2. conf.setBoolean("mapreduce.map.output.compress",true);
  3.  
  4. //设置压缩方法
  5. //默认
  6. conf.setClass("mapreduce.map.output.compress.codec",DefaultCodeC.class,CompressionCodec.class);
  7. //Bzip2
  8. conf.setClass("mapreduce.mapt.output.compress.codec",Bzip2Codec.class,CompressionCode.class);
  9. //LZO
  10. conf.setClass("mapreduce.map.output.compress.codec".LZOCodec.class,CompressionCodec.class);

 

    注意:在map端开启压缩并不能从结果文件中看到结果的改变,只要程序运行成功就代表设置没问题!

   2)在reduce端对数据进行压缩

    在设置reduce输出数据类型之后加入配置信息:

  1. //开启reduce端的输出压缩
  2. FileOutputFormat.setCompressOutput(job,true);
  3. //设置压缩方法
  4. //默认
  5. FileOutputFormat.setOutputCompressorClass(job,DefaultCodec.class);
  6. //Bzip2
  7. FileOutputFormat.setOutputCompressorClass(job,Bzip2Codec.class);
  8. //Gzip
  9. FileOutputFormat.setOutputCompressorClass(job,GzipCodec.class);

    三种选择一种即可,可以看到对应的结果文件看到被压缩的结果文件。

  2.自定义压缩方法

 

  1. /**
  2. * @author: PrincessHug
  3. * @date: 2019/4/8, 9:49
  4. * @Blog: https://www.cnblogs.com/HelloBigTable/
  5. */
  6. public class TestCompress {
  7. public static void main(String[] args) throws IOException, ClassNotFoundException {
  8. Compress("G:\\weblog.log","org.apache.hadoop.io.compress.BZip2Codec");
  9. }
  10.  
  11. //自定义压缩方法
  12. private static void Compress(String fileName,String method) throws IOException, ClassNotFoundException {
  13. //获取输入流
  14. FileInputStream fis = new FileInputStream(new File(fileName));
  15.  
  16. //通过反射获取压缩方法并初始化
  17. Class cName = Class.forName(method);
  18. CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(cName, new Configuration());
  19.  
  20. //定义输出流
  21. FileOutputStream fos = new FileOutputStream(new File(fileName + codec.getDefaultExtension()));
  22.  
  23. //创建压缩输出流
  24. CompressionOutputStream cos = codec.createOutputStream(fos);
  25.  
  26. //流的拷贝
  27. IOUtils.copyBytes(fis,cos,2*1024*1024,false);
  28.  
  29. //关闭资源
  30. fis.close();
  31. cos.close();
  32. fos.close();
  33. }
  34. }

  

  

 

原文链接:http://www.cnblogs.com/HelloBigTable/p/10668931.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号