一、目的

  a. 减小磁盘占用

  b. 加速网络IO

二、几个常用压缩算法

      

是否可切分:是指压缩后的文件能否支持在任意位置往后读取数据。

各种压缩格式特点:

  压缩算法都需要权衡 空间/时间 ;压缩率越高,就需要更多的压缩解压缩时间;压缩时有9个级别来控制:1为优化压缩速度,9为优化压缩率(如 gzip -1 file);

  相比之下 gzip是一个空间/时间都比较适中的压缩算法;bzip2特点是压缩率高,且可切分;LZO/LZ4/Snappy压缩速度快,比gzip快一个数量级,且LZ4和Snappy又比LZO快很多;

  

三、使用方法

1、codec

  在Hadoop中,一个对CompressionCodec接口的实现代表一个codec,例如GzipCodec封装了gzip算法;

2、在代码利用CompressionCodec来实现 

public class StreamCompressor {
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, 4096, false);
out.finish();
}
}

  可利用CompressionCodecFactory 来识别压缩文件的算法,并可获取对应的codec:CompressionCodec codec = factory.getCodec(inputPath);主要利用文件名的后缀来识别判断。

3、使用native来实现压缩

  

  可通过Java系统的java.library.path来设置原生代码库,bin目录下的hadoop脚本可能设置,也可手动去设置。

  hadoop会默认去搜索是否有原生代码库,如有则会加载使用。也可心通过hadoop.native.lib去禁用使用原生代码库。

4、若大量使用codec,可使用CodecPool来优化创建和销毁codec的开销。

四、选择压缩算法

  不支付切分的压缩算法,若在压缩后大于HDFS上一人块的大小,那在HDFS分被开存储;MapReduce在处理它时不会以split设置的大小去切分它,它会识别出不可切分后,会把整个文件都读取过来进行处理;总的来说这样并不好,牺牲了数据的本地性,大量时间花费在网络IO上。

  选择优先从上到下:(主要考虑文件大小 )

    1、大量小文件:使用容器文件格式,如SequenceFile、RCFile或Avro数据文件,所有这些都支持压缩和切分;通常与一个快速压缩工具使用,如LZO,LZ4,Snappy;

    2、大文件:bzip2是个不错的选择,尽管非常慢;或者索引过的LZO;

    3、压缩后和block差不多大(略小于block),可使用LZO\LZ4\Snappy;

五、在MapReduce中使用压缩

  1、mapred.output.compress属性设为true,mapred.output.compression.codec设置为要使用的压缩的codec的类名;

  2、在代码中设置:

      FileOutputFormat.setCompressOutput( job, true );

      FileOutputFormat.setOutputCompressorClass( job, GzipCodec.class );

  3、如果是SequenceFile,可设置mapred.output.compression.type来限制压缩格式。默认是RECORD,可选NONE,BLOCK;

     或使用SequenceFileOutputFormat类中静态方法putCompressionType()来设置。

    

  4、只对map输入进行压缩:

    map结果存储在节点的本地,并通过网络传输到reducer,这个过程可使用LZO,LZ4,Snappy来获取性能的提升;

    

    或在作业中使用:   

//新API
Configuration conf = new Configuration(); conf.setBoolean("mapred.compress.map.output", true); conf.setClass("mapred.map.output.compression.codec", GzipCodec.class,
CompressionCodec.class); Job job = new Job(conf); //旧API
conf.setCompressMapOutput(true); conf.setMapOutputCompressorClass(GzipCodec.class);

  

    

Hadoop 文件压缩的更多相关文章

  1. Hadoop文件压缩

    1. Hadoop的文件压缩需求 文件压缩对于大容量的分布式存储系统而言是必须的,它能带来两个好处: 1)减少了文件所需的存储空间: 2)加快了文件在网络上或磁盘间的传输速度. 2. Hadoop支持 ...

  2. hadoop对于压缩文件的支持及算法优缺点

    hadoop对于压缩文件的支持及算法优缺点   hadoop对于压缩格式的是透明识别,我们的MapReduce任务的执行是透明的,hadoop能够自动为我们 将压缩的文件解压,而不用我们去关心. 如果 ...

  3. hadoop对于压缩文件的支持

    转载:https://www.cnblogs.com/ggjucheng/archive/2012/04/22/2465580.html hadoop对于压缩格式的是透明识别,我们的MapReduce ...

  4. 【原创】Hadoop的IO模型(数据序列化,文件压缩)

    数据序列化 我们知道,数据在分布式系统上运行程序数据是需要在机器之间通过网络传输的,这些数据必须被编码成一个个的字节才可以进行传输,这个其实就是我们所谓的数据序列化.数据中心中,最稀缺的资源就是网络带 ...

  5. hadoop的压缩解压缩,reduce端join,map端join

    hadoop的压缩解压缩 hadoop对于常见的几种压缩算法对于我们的mapreduce都是内置支持,不需要我们关心.经过map之后,数据会产生输出经过shuffle,这个时候的shuffle过程特别 ...

  6. Linux 文件压缩与归档

    .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...

  7. php多文件压缩下载

    /*php多文件压缩并且下载*/ function addFileToZip($path,$zip){ $handler=opendir($path); //打开当前文件夹由$path指定. whil ...

  8. Zip文件压缩(加密||非加密||压缩指定目录||压缩目录下的单个文件||根据路径压缩||根据流压缩)

    1.写入Excel,并加密压缩.不保存文件 String dcxh = String.format("%03d", keyValue); String folderFileName ...

  9. Java实现文件压缩与解压

    Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例.(转载自http://www.puiedu. ...

随机推荐

  1. python简易爬虫,帮助理解re模块

    20161203更新: 1.使用了BS4解析html 2.使用了mysql-connector插入了数据库表 pip install mysql-connector import urllib.req ...

  2. linux下面MySQL变量修改及生效

    今天在访问mysql项目的时候突然报500错误,没有找到连接,因此想到mysql的连接时间. mysql> show global variables; 主要就是连接时间是28800(8小时), ...

  3. Laravel 数据库操作之Eloquent ORM模型

    //模型中的相关代码 namespace App; use Illuminate\Database\Eloquent\Model; class Student extends Model{ //默认对 ...

  4. 2017 ACM/ICPC Asia Regional Beijing Online 记录

    题目链接  Beijing

  5. BZOJ——1614: [Usaco2007 Jan]Telephone Lines架设电话线

    Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1930  Solved: 823[Submit][Status][Discuss] Description ...

  6. 洛谷——P2819 图的m着色问题

    P2819 图的m着色问题 题目背景 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的 ...

  7. MySQL 5.6.20-4 and Oracle Linux DTrace

    https://blogs.oracle.com/wim/entry/mysql_5_6_20_4?utm_source=tuicool&utm_medium=referral By WimC ...

  8. 【转】Linux cp -a用法

    cp file1 file1-bk  ---------> 这样复制备份的话文件的属性(创建时间这些会变化) 要想不变化, cp -a  file1 file-bk  加上一个 -a 这个参数就 ...

  9. ubuntu 14.04安装nodejs

    http://stackoverflow.com/questions/32902699/cannot-install-ember-on-ubuntu-1404/33495134

  10. 转: DNS 原理入门 (from 阮一峰)

    转自:http://www.ruanyifeng.com/blog/2016/06/dns.html DNS 原理入门   作者: 阮一峰 日期: 2016年6月16日 DNS 是互联网核心协议之一. ...