作为输入

当压缩文件作为MapReduce的输入时,MapReduce将自动通过扩展名找到相应的Codec对其解压。

作为输出

当MapReduce的输出文件需要压缩时,可以更改mapred.output.compress为true,mapred.output.compression.codec为想要使用的codec的类名称,当然你可以可以在代码中指定,通过调用FileOutputFormt的静态方法去设置这两个属性:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.hadoop.codecs;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.compress.GzipCodec;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
public class CodecDemo {
    public static void main(String[] args) throws Exception {
        if (args.length!=2){
            System.exit(-1);
        }
        Job job=new Job();
        job.setJarByClass(CodecDemo.class);
        job.setJobName("CodecDemo");
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        job.setMapperClass(MyMapper.class);
        job.setCombinerClass(MyReducer.class);
        job.setReducerClass(MyReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
    //设置输出压缩开启
        FileOutputFormat.setCompressOutput(job, true);
    //设置压缩类:GzipCodec
        FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);
        System.exit(job.waitForCompletion(true)?0:1);
    }
}

使用CompressionCodes解压缩

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*
使用CompressionCodes解压缩CompressionCodec有两个方法可以方便的压缩和解压。
压缩:通过createOutputStream(OutputStream out)方法获得CompressionOutputStream对象
解压:通过createInputStream(InputStream in)方法获得CompressionInputStream对象
从命令行接受一个CompressionCodec实现类的参数,然后通过ReflectionUtils把实例化这个类,调用CompressionCodec的接口方法对标准输出流进行封装,封装成一个压缩流,通过IOUtils类的copyBytes方法把标准输入流拷贝到压缩流中,最后调用CompressionCodec的finish方法,完成压缩。
*/
package com.hadoop.codecs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionOutputStream;
import org.apache.hadoop.util.ReflectionUtils;
public class Compressors {
    public static void main(String[] args) throws Exception {
        String codecClassName = args[0];
        Class<?> codecClass = Class.forName(codecClassName);
        Configuration conf = new Configuration();
        CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass, conf);
        CompressionOutputStream out = codec.createOutputStream(System.out);
        IOUtils.copyBytes(System.in, out, 4096false);
        out.finish();
    }
}

使用CompressionCodecFactory解压缩

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
    如果你想读取一个被压缩的文件的话,首先你得先通过扩展名判断该用哪种codec,当然有更简便得办法,CompressionCodecFactory已经帮你把这件事做了,通过传入一个Path调用它得getCodec方法,即可获得相应得codec。
    注意看下removeSuffix方法,这是一个静态方法,它可以将文件的后缀去掉,然后我们将这个路径做为解压的输出路径。CompressionCodecFactory能找到的codec也是有限的,默认只有三种org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.DefaultCodec,如果想添加其他的codec你需要更改io.compression.codecs属性,并注册codec。
*/
package com.hadoop.codecs;  
import org.apache.hadoop.conf.Configuration;  
import org.apache.hadoop.fs.FileSystem;  
import org.apache.hadoop.fs.Path;  
import org.apache.hadoop.io.IOUtils;  
import org.apache.hadoop.io.compress.CompressionCodec;  
import org.apache.hadoop.io.compress.CompressionCodecFactory;  
   
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.net.URI;  
   
public class FileDecompressor {  
    public static void main(String[] args) throws Exception {  
        String uri = args[0];  
        Configuration conf = new Configuration();  
        FileSystem fs = FileSystem.get(URI.create(uri), conf);  
   
        Path inputPath = new Path(uri);  
        CompressionCodecFactory factory = new CompressionCodecFactory(conf);  
        CompressionCodec codec = factory.getCodec(inputPath);  
        if (codec == null) {  
            System.out.println("No codec found:" + uri);  
            System.exit(1);  
        }  
        String outputUri = CompressionCodecFactory.removeSuffix(uri, codec.getDefaultExtension());  
   
        InputStream in = null;  
        OutputStream out = null;  
   
        try {  
            in = codec.createInputStream(fs.open(inputPath));  
            out = fs.create(new Path(outputUri));  
            IOUtils.copyBytes(in,out,conf);  
        finally {  
            IOUtils.closeStream(in);  
            IOUtils.closeStream(out);  
        }  
    }  
}

Hadoop中的压缩Codec相关推荐

  1. hadoop中MapReduce中压缩的使用及4种压缩格式的特征的比较

    在比较四中压缩方法之前,先来点干的,说一下在MapReduce的job中怎么使用压缩. MapReduce的压缩分为map端输出内容的压缩和reduce端输出的压缩,配置很简单,只要在作业的conf中 ...

  2. 关于几种压缩算法以及hadoop和hbase中的压缩配置说明

    Hadoop中常用的压缩算法有bzip2.gzip.lzo.snappy,其中lzo.snappy需要操作系统安装native库才可以支持 下面这张表,是比较官方一点的统计,不同的场合用不同的压缩算法 ...

  3. Hadoop在MapReduce中使用压缩详解

    Hadoop对于压缩格式的是透明识别,我们的MapReduce任务的执行是透明的,Hadoop能够自动为我们将压缩的文件解压,而不用我们去关心. AD:51CTO学院:IT精品课程在线看! Hadoo ...

  4. 4种常用压缩格式在hadoop中的应用

    目前在hadoop中用得比较多的有lzo,gzip,snappy,bzip2这4种压缩格式,笔者根据实践经验介绍一下这4种压缩格式的优缺点和应用场景,以便大家在实践中根据实际情况选择不同的压缩格式. ...

  5. Hadoop SequnceFile.Writer 压缩模式及压缩库浅析

    2019独角兽企业重金招聘Python工程师标准>>> 先说明SequnceFile的压缩类型(Compression Type)分为三种NONE,RECORD,BLOCK,通过配置 ...

  6. hadoop中使用lzo压缩算法

    在hadoop中使用lzo的压缩算法可以减小数据的大小和数据的磁盘读写时间,不仅如此,lzo是基于block分块的,这样他就允许数据被分解成chunk,并行的被hadoop处理.这样的特点,就可以让l ...

  7. Hadoop之Lzo压缩配置

    Hadoop之Lzo压缩配置 一.hadoop-lzo编译 hadoop本身并不支持lzo压缩,故需要使用twitter提供的hadoop-lzo开源组件.hadoop-lzo需依赖hadoop和lz ...

  8. hadoop 实现文件压缩

    hadoop 实现文件压缩 转载http://blog.csdn.net/u011491148/article/details/9966369# 感谢 转载的博主分享! cd /home/xm/com ...

  9. MapReduce中的压缩和解压缩

    在MR中,压缩是个可选项,是为了减少IO流次数 一.概述 压缩技术能够有效减少底层存储系统(HDFS)读写字节数.压缩提高了网络带宽和磁盘空间的效率.在运行MR程序时,I/O操作.网络数据传输. Sh ...

最新文章

  1. 傅里叶描述子欧氏距离_机器学习中的各种距离
  2. 爱因斯坦牛顿达尔文投胎中国后
  3. Windows Server 2016与旧版本系统比较
  4. idea tomcat部署web项目_项目开发之部署帆软到Tomcat服务一
  5. 科大讯飞回应同传造假:人机耦合才是未来发展之道
  6. 代理模式(Proxy)--静态代理
  7. RestFul 风格规范
  8. eNSP 华为模拟器更新说明
  9. Q新闻丨吃鸡外挂被开源;Dubbo 3.0来了;工信部约谈百度、支付宝、今日头条;内地iCloud服务将转由云上贵州运营...
  10. tekla钢结构算量_钢结构、Tekla及建筑工业化厂商对Tekla软件的开发和应用
  11. Linux 音频驱动(六) ALSA音频驱动之PCM Write数据传递过程
  12. 一款高颜值的词云包让我拍案叫绝
  13. 链表的两种创建方法——头插法与尾插法
  14. TIA西门子博途V17安装教程及注意事项
  15. 如何搭建一个自己的音乐播放器-使用腾讯云轻量应用服务器搭建YesPlayMusic网易云播放器
  16. unity算法面试_Unity面试经验
  17. Java基础练习(十二)集合与数组工具类使用,BigDecimal使用,实现二分查找,快速排序
  18. 机器学习进阶之概率论(1)
  19. Lasso回归(Stata)
  20. 机器语言——码运算(详解反码补码由来)

热门文章

  1. paramiko基础
  2. Openstack启用spice协议
  3. PL/SQL程序设计 第一章 PL/SQL 程序设计简介
  4. 对象存储/编码/解码
  5. Vue.js 学习笔记 第5章 内置指令
  6. python——模块1、模块的分类
  7. 铁乐学python_Day40_进程池
  8. CodeForces - 755C PolandBall and Forest (并查集)
  9. 使用VC6.0创建和运行C程序的方法
  10. multipart/form-data ajax 提交问题(未解决)