一、目的

  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. TeraTerm下载

    参考:http://blog.csdn.net/gxp/article/details/9169319 官方主页: http://ttssh2.sourceforge.jp/ 官方下载: http:/ ...

  2. bzoj3874&2832 [Ahoi2014]宅男计划 模拟退火,三分

    [Ahoi2014&Jsoi2014]宅男计划 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 962  Solved: 371[Submit][ ...

  3. LA 2797 平面区域dfs

    题目大意:一个平面区域有n条线段,问能否从(0,0)处到达无穷远处(不穿过任何线段) 分析:若两条线段有一个端点重合,这种情况是不能从端点重合处穿过的 的.因此对每个端点延长一点,就可以避免这个问题. ...

  4. LA 4728 旋转卡壳算法求凸包的最大直径

    #include<iostream> #include<cstdio> #include<cmath> #include<vector> #includ ...

  5. tensorflow加载embedding模型进行可视化

    1.功能 采用python的gensim模块训练的word2vec模型,然后采用tensorflow读取模型可视化embedding向量 ps:采用C++版本训练的w2v模型,python的gensi ...

  6. Bootstrap开启模态框后对数据处理(标记模态框的开启与关闭状态)

    JS用全局变量标记状态,方法中动态修改全局变量以标记状态是一个重要思想. 需求:组合条件查询数据,查询完之后填充到模态框中,开启模态框,模态框中有组合条件查询,此时查询只需要更新模态框表格数据不需要开 ...

  7. Django实现的博客系统中使用富文本编辑器ckeditor

    操作系统为OS X 10.9.2,Django为1.6.5. 1.下载和安装 1.1 安装 ckeditor 下载地址 https://github.com/shaunsephton/django-c ...

  8. 洛谷—— P1051 谁拿了最多奖学金

    https://www.luogu.org/problem/show?pid=1051 题目描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 1) 院士奖 ...

  9. 《流畅的Python》一副扑克牌中的难点

    1.现在在看<流畅的Python>这本书,看了三页就发现,这本书果然不是让新手来入门的,一些很常见的知识点能被这个作者玩出花来, 唉,我就在想,下面要分析的这些的代码,就算我费劲巴拉的看懂 ...

  10. IntelliJ IDEA出现:This file is indented with tabs instead of 4 spaces的问题解决

    根据阿里巴巴Java开发手册,不能使用Tab字符,改成4个字符,设置如下: 注意:是不选择! 一定要选择这个: