Hadoop文件压缩

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

hadoop里支持很多种压缩格式,我们看一个表格:

DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman ">Coding)的一个无损数据压缩算法,源代码可以在zlib库中找到。gzip是以DEFLATE算法为基础扩展出来的一种算法。

所有的压缩算法都是空间和时间的转换,更快压缩时间还是更小的压缩比,可以通过参数来指定,-1意味着速度,-9意味着空间。拿gzip做个例子,下面就意味着更快速的压缩:

[plain] view plaincopy

gzip -1 file

gzip在时间和空间上的取舍比较折中,bzip2压缩比gzip更有效,但是速度更慢。bzip2的解压速度比它的压缩速度要快。但是和其他压缩格式比又是最慢的,但是压缩效果明显是最好的。snappy和lz4的解压速度比lzo好很多。

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

举个例子,一个未压缩的文件有1GB大小,hdfs默认的block大小是64MB,那么这个文件就会被分为16个block作为mapreduce的输入,每一个单独使用一个map任务。如果这个文件是已经使用gzip压缩的呢,如果分成16个块,每个块做成一个输入,显然是不合适的,因为gzip压缩流的随即读是不可能的。实际上,当mapreduce处理压缩格式的文件的时候它会认识到这是一个gzip的压缩文件,而gzip又不支持随即读,它就会把16个块分给一个map去处理,这里就会有很多非本地处理的map任务,整个过程耗费的时间就会相当长。

lzo压缩格式也会是同样的问题,但是通过使用hadoop lzo库的索引工具以后,lzo就可以支持splittable。bzip2也是支持splittable的。

那么如何选择压缩格式呢?这取决于文件的大小,你使用的压缩工具,下面是几条选择建议,效率由高到低排序:

1.用一些包含了压缩并且支持splittable的文件格式,比如Sequence File,RCFile或者Avro文件,这些文件格式我们之后都会讲到。如果为了快速压缩可以使用lzo,lz4或者snappy压缩格式。

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

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

4.不要压缩文件

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

感谢Tom White,此文章大部分来自于大神的definitive guide,奈何中文版翻译太烂,就在英文原版的基础上和官方的一些文档加入一些自己的理解。

全当是读书笔记吧,画蛇添足之举。

时间: 2025-01-30 20:04:13

Hadoop文件压缩的相关文章

Hadoop文件常用压缩方法的压缩效果比较

对于Hadoop文件常用的几种压缩方法,我写了一个java程序进行比较. 期望是,给出一个大文件(bigfile.txt) ,我们用各种方式压缩他们然后最终复制到HDFS中. 代码很简单:就是构造codec的实例,然后让它来创建到HDFS的输出流 /* */ package com.charles.hadoop.fs; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.InputS

Amr Awadallah:通过来自Cloudera的Hadoop来压缩大数据 - 产品和技术

Amr Awadallah:通过来自http://www.aliyun.com/zixun/aggregation/13456.html">Cloudera的Hadoop来压缩大数据 发布时间:2012.05.25 10:31      来源:赛迪网     作者:赛迪网 [赛迪网讯]Cloudera创始人兼CTO Amr Awadallah近日访华,他表示,我们都知道如何去存储数据,但不知道如何去处理或者是回答一些关于数据的问题.我们可以通过使用Hadoop让数据存留时更长,完成数据良好

struts2.0-struts2 将文件压缩后 下载却不成功

问题描述 struts2 将文件压缩后 下载却不成功 我用struts2 做了个文件下载功能. 对于未压缩过的文件 一下子就下完了.. 用ZipOutputStream做成压缩包后,只能下载一部分,然后就下不动了.. 这是什么问题..不压缩能下得动,压缩完就不行.是struts2 对下载压缩支持不好吗? inputStream = new FileInputStream(new File("E:work_myeclipse.metadata.me_tcatwebapps eport_manage

Linux文件压缩和解压缩命令使用详解

  在Linux系统中,我们通常使用的文件压缩命令有:bunzip2 , bzip2 , cpio , gunzip , gzip ,split(切割文件) , zgrep(在压缩文件中寻找匹配的正则表达式), zip ,unzip, tar ,rar. 最后四个是我比较常用的,今天的笔记就写这四个的好了. 1.tar: tar命令:tar [选项...] [FILE]... 输入"tar -?"获取相关帮助信息,tar的帮助文档给出示例如下: 示例 tar -cf archive.t

Windows 8 Store Apps学习70) 其它: 文件压缩和解压缩

重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的生命周期和程序的生命周期 作者:webabcd 介绍 重新想象 Windows 8 Store Apps 之 其它 文件压缩和解压缩 与 Windows 商店相关的操作 app 与 web 几个 Core 的应用 页面的生命周期和程序的生命周期 示例 1.演示如何压缩和解压缩文件 Feature/Compress

Asp.net利用RAR做文件压缩解压缩

如果服务器上安装了RAR程序,那么asp.net可以调用RAR实现文件压缩与解压缩. 不过要注意的是,由于Web程序不能直接调用客户端的程序(除非用ActiveX,ActiveX几乎被废弃),所以如果要想实现让用户把本地文件用网页解压缩只有把文件上传到服务器上再调用服务器上的RAR压缩,同理要解压缩本地的RAR文件可以把文件上传到服务器解压再拿回来. 本文讲怎么在服务器端的目录解压缩文件! 前台代码: <%...@ Page Language="C#" AutoEventWire

php文件压缩之PHPZip类用法实例

  本文实例讲述了php文件压缩之PHPZip类用法.分享给大家供大家参考.具体如下: ? 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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

Linux文件压缩和解压缩命令

 在Linux系统中,我们通常使用的文件压缩命令有:bunzip2 , bzip2 , cpio , gunzip , gzip ,split(切割文件) , zgrep(在压缩文件中寻找匹配的正则表达式), zip ,unzip, tar ,rar. 最后四个是我比较常用的,今天的笔记就写这四个的好了. 1.tar: tar命令:tar [选项...] [FILE]... 输入"tar -?"获取相关帮助信息,tar的帮助文档给出示例如下: 示例   tar -cf archive.

Linux的文件压缩——tar和zip命令

今天因为准备远程压缩个文件,结果用tar命令失败了好几次.看来命令还是常用才熟悉啊. tar命令: 简介:tar命令只是把目录打包成一个归档(文件),并不负责压缩.在tar命令中可以带参数调用gzip或bzip2压缩.因为gzip和bzip2只能压缩单个文件. 在linux下是不需要后缀名的,但通常tar归档后缀名为.tar,gzip压缩后的后缀名为.gz,bzip2压缩后的后缀名为.bz2. 命令用法: tar [参数]  [文件或目录] 1 #比如把x文件夹打包并用gzip压缩. 2 tar