Hadoop的压缩算法

常见数据压缩算法压缩

文件压缩主要有两个好处,一是减少了存储文件所占空间,另一个就是为数据传输提速。在hadoop大数据的背景下,这两点尤为重要,那么我现在就先来了解下hadoop中的文件压缩。hadoop里支持很多种压缩格式,我们看一个表格:

LZO和LZ4算法已经不在Hadoop1.x中使用了。

1、DEFLATE是同时使用了LZ77与哈夫曼编码的一个无损数据压缩算法,

源代码可以在zlib库中找到。gzip是以DEFLATE算法为基础扩展出来的一种算法。

2、压缩算法都是空间和时间的转换,更快压缩时间还是更小的压缩比。可以通过参数来指定,-1意味着速度,-9意味着空间。

拿gzip做个例子,下面就意味着更快速的从缩:gzip -1 file

3、gzip在时间和空间上的比较适中,bzip2压缩比gzip更有效,但是速度更慢。bzip2的解压速度比它的压缩速度要快。但是和其他压缩格式相比又是最慢的,但是压缩效果明显是最好的。snappy和LZ4的解压速度比LZO好很多。

4、splittable表示压缩格式是否可以被分割,也就是说是否支持随机读。压缩数据是否能被mapreduce使用,压缩数据是否能被分割就很关键了。

目前在Hadoop中用得比较多的有lzo,gzip,snappy,bzip2这4种压缩格式。下面是4种压缩格式的特征的比较

Codec实现类

org.apache.hadoop.io.compress

CompressionCodec是压缩和解压缩的接口。以下是该接口的实现类。

CompressionCodec方法

CompressionCodec有两个方法用来压缩和解压

压缩:通过createOutputStream(OutputStream out)方法获得CompressionOutputStream对象

解压:通过createlnputStream(InputStream in)方法获得Compressionlnputstream对象

编写下面的例子进行比较

dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

拷贝生成一个512M的文件
[[email protected] liguodong]#  dd if=/dev/zero of=data bs=1024k count=512
记录了512+0 的读入
记录了512+0 的写出
536870912字节(537 MB)已复制,0.557151 秒,964 MB/秒
[[email protected] liguodong]# ll data
-rw-r--r-- 1 root root 536870912 6月   5 19:11 data
[[email protected] liguodong]# pwd
/liguodong
[[email protected] liguodong]# ls
codec.jar  data  dir  jni
package Compress;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

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.mapreduce.Job;
import org.apache.hadoop.util.ReflectionUtils;

public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1、配置
        Configuration configuration = new Configuration();

        Job job = Job.getInstance(configuration, "Codec");
        //2、打包运行必须执行的方法
        job.setJarByClass(Test.class);

        //String codecClassName = "org.apache.hadoop.io.compress.BZip2Codec";
        String codecClassName = "org.apache.hadoop.io.compress.GzipCodec";
        Class<?> clsClass = Class.forName(codecClassName);

        CompressionCodec codec = (CompressionCodec)
                ReflectionUtils.newInstance(clsClass, configuration);
        String inputFile = "/liguodong/data";

        String outFile = inputFile + codec.getDefaultExtension();//获得默认扩展名

        FileOutputStream fileOut = new FileOutputStream(outFile);
        CompressionOutputStream out = codec.createOutputStream(fileOut);
        FileInputStream in = new FileInputStream(inputFile);
        IOUtils.copyBytes(in, out, 4096 ,false);
        in.close();
        out.close();
    }
}

打成jar包:codec.jar

运行

[[email protected] liguodong]# yarn jar codec.jar
15/06/05 19:48:04 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
[[email protected] liguodong]# ls
codec.jar  data  data.bz2  data.gz  dir  gzipcodec.jar  jni
比较
[[email protected] liguodong]# ll
总用量 524824
-rw-r--r-- 1 root root 536870912 6月   5 19:11 data
-rw-r--r-- 1 root root       402 6月   5 19:48 data.bz2
-rw-r--r-- 1 root root    521844 6月   5 20:17 data.gz

怎么选择压缩算法?

1、用一些包含了压缩并且支持splittable的文件格式,比如SequenceFile,RCFile或者Avro文件。

2、使用提供splittable的压缩格式,比如,bzip2和索引后可以支持splittable的lzo。

3、提前把文件分成几个块,每个块单独压缩,这样就无需考虑splittable的问题了。

4、不要压缩文件,以不支持splittable的压缩格式存储一个很大的数据文件是不合适的,非本地处理效率会非常之低。

时间: 2024-11-05 15:52:14

Hadoop的压缩算法的相关文章

【转】Hadoop在MapReduce中使用压缩详解

原文链接 http://www.cnblogs.com/ggjucheng/archive/2012/04/22/2465580.html#top hadoop对于压缩文件的支持 hadoop对于压缩格式的是透明识别,我们的MapReduce任务的执行是透明的,hadoop能够自动为我们 将压缩的文件解压,而不用我们去关心. 如果我们压缩的文件有相应压缩格式的扩展名(比如lzo,gz,bzip2等),hadoop就会根据扩展名去选择解码器解压. hadoop对每个压缩格式的支持,详细见下表:  

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

hadoop对于压缩文件的支持及算法优缺点   hadoop对于压缩格式的是透明识别,我们的MapReduce任务的执行是透明的,hadoop能够自动为我们 将压缩的文件解压,而不用我们去关心. 如果我们压缩的文件有相应压缩格式的扩展名(比如lzo,gz,bzip2等),hadoop就会根据扩展名去选择解码器解压. 压缩格式 工具 算法 文件扩展名 多文件 可分割性 DEFLATE 无 DEFLATE .deflate 不 不 gzip gzip DEFLATE .gz 不 不 ZIP zip

MapReduce Shuffle过程

MapReduce Shuffle 过程详解 一.MapReduce Shuffle过程 1. Map Shuffle过程 2. Reduce Shuffle过程 二.Map Shuffle过程 1.   环形缓冲区 Map输出结果是先放入内存中的一个环形缓冲区,这个环形缓冲区默认大小为100M(这个大小可以在io.sort.mb属性中设置),当环形缓冲区里的数据量达到阀值时(这个值可以在io.sort.spill.percent属性中设置)就会溢出写入到磁盘,环形缓冲区是遵循先进先出原则,Ma

Hadoop对小文件的解决方案

小文件指的是那些size比HDFS的block size(默认64M)小的多的文件.任何一个文件,目录和block,在HDFS中都会被表示为一个object存储在namenode的内存中, 每一个object占用150 bytes的内存空间.所以,如果有10million个文件, 每一个文件对应一个block,那么就将要消耗namenode 3G的内存来保存这些block的信息.如果规模再大一些,那么将会超出现阶段计算机硬件所能满足的极限. 控制小文件的方法有: 1.应用程序自己控制 2.arc

Hadoop序列化与压缩

传统的的计算机系统通过I/O操作与外界交流,,Hadoop的I/O由传统的I/O系统发展而来,但是又有些不同,Hadoop需要处理P.T级别的数据,所以在org.apache.hadoop.io包中包含了一些面向海量数据处理的基本输入输出工具,本文会对其中的序列化和压缩进行研究. 1 序列化 对象的序列化用于将对象编码成一个字节流,以及从字节流中重新构建对象.将一个对象编码成一个字节流称为序列化对象(Serializing),相反的处理过程称为反序列化. 序列化有三种主要的用途: A.作为一种持

Hadoop 数据压缩

文件压缩主要有两个好处,一是减少了存储文件所占空间,另一个就是为数据传输提速.在hadoop大数据的背景下,这两点尤为重要,那么我现在就先来了解一下hadoop的文件压缩. Hadoop里支持很多种压缩格式,看下表: DEFLATE是同时使用了LZ77算法与哈弗曼编码(Huffman Coding)的一个无损数据压缩算法,源代码可以在zlib库中找到.gzip是以DEFLATE算法为基础扩展出来的一种算法. 所有的压缩算法都是空间和时间的转换,更快压缩时间还是更小压缩比,可以通过参数来指定,-1

hadoop MapReduce - 从作业、任务(task)、管理员角度调优

1.Combiner的作用是什么?2.作业级别参数如何调优?3.任务及管理员级别有哪些可以调优? Hadoop为用户作业提供了多种可配置的参数,以允许用户根据作业特点调整这些参数值使作业运行效率达到最优. 一 应用程序编写规范1.设置Combiner        对于一大批MapReduce程序,如果可以设置一个Combiner,那么对于提高作业性能是十分有帮助的.Combiner可减少Map Task中间输出的结果,从而减少各个Reduce Task的远程拷贝数据量,最终表现为Map Tas

Hadoop 中SequenceFile的简介

概念 SequenceFile是一个由二进制序列化过的key/value的字节流组成的文本存储文件,它可以在map/reduce过程中的input/output 的format时被使用.在map/reduce过程中,map处理文件的临时输出就是使用SequenceFile处理过的. 所以一般的SequenceFile均是在FileSystem中生成,供map调用的原始文件. 特点 SequenceFile是 Hadoop 的一个重要数据文件类型,它提供key-value的存储,但与传统key-v

比较Apache Hadoop生态系统中不同的文件格式和存储引擎的性能

这篇文章提出了在Apache Hadoop生态系统中对比一些当前流行的数据格式和可用的存储引擎的性能:Apache Avro,Apache Parquet,Apache HBase和Apache Kudu空间效率,提取性能,分析扫描以及随机数据查找等领域.这有助于理解它们中的每一个如何(何时)改善你的大数据工作负载的处理能力. 引言 最初把Hadoop文件格式和存储引擎做比较的想法是在初始系统修订版之一的驱动下完成的 --这个系统是在CERN中大规模调节Hadoop-ATLAS EventInd