一、目的

  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. Cstring中GetBuffer()方法的主要作用

    摘自:http://bbs.csdn.net/topics/310247836 GetBuffer()主要作用是将字符串的缓冲区长度锁定   CString::GetBuffer有两个重载版本: (1 ...

  2. 2013年EI收录的中国期刊

    ISSN 刊名 0567-7718 Acta Mechanica Sinica 1006-7191 Acta Metallurgica Sinica (English Letters) 0253-48 ...

  3. Codeforces963D. Frequency of String

    $n \leq 100000$的一文本串,给$m \leq 100000$个询问,每次问一小串在文本串的哪一个最短的子串里出现指定次数.注意,询问串互不相同,且总长度$\leq 100000$. 比赛 ...

  4. 在GridView中的每一页末尾添加空行

    原文发布时间为:2008-08-03 -- 来源于本人的百度文章 [由搬家工具导入] protected void GridView1_RowCreated(object sender, GridVi ...

  5. Powerdesigner 使用小技巧

    1.table与table之间:改直角为直线; 2.Name 和code 不联动

  6. Objective-C单例模式的常用实现

    oc中单例模式可以使用以下方法来实现 + (YourClass *)sharedInstance { static dispatch_once_t once; static YourClass *sh ...

  7. android中自定义下拉框(转)

    android自带的下拉框好用不?我觉得有时候好用,有时候难有,项目规定这样的效果,自带的控件实现不了,那么只有我们自己来老老实实滴写一个新的了,其实最基本的下拉框就像一些资料填写时,点击的时候出现在 ...

  8. Springboot 工具类静态注入

    用springboot搭了一个项目,里面要用到一个DictUtils,因为要用到DictMapper,在百度找了一些方法,最后用下面的方法能成功获取到DictMapper @Component pub ...

  9. Websocket -- JS的前端页面

    一个html5 WebSocket + JS的简单Echo例子,例子代码演示效果猛戳链接:websocket例子(打开页面,稍等一会) 使用一个文本编辑器,把下面代码复制保存在一个 websocket ...

  10. kibana dev tools快捷键

    kibana dev tools快捷键 ctrl+enter  提交请求 ctrl+i 自动缩进 ctrl+enter 提交请求 down 打开自动补全菜单 enter或tab 选中项自动补全 esc ...