hadoop6-常见压缩算法

本文介绍了Hadoop中常见的数据压缩算法,包括Deflate, gzip, bzip2, LZO, LZ4和Snappy。讨论了压缩速度与压缩比之间的权衡,并指出gzip在时间和空间上较为适中,而bzip2压缩效果最好但速度最慢。同时,文章提到了Snappy和LZ4的压缩速度优势,以及它们在Hadoop中的使用和配置方法。此外,还强调了压缩格式是否支持split的重要性,以及如何解决在安装和使用这些压缩库时可能遇到的问题。" 127062360,15281524,基于微信小程序的南通农商银行微银行系统开发,"['微信小程序开发', 'java后端', '银行信息化', 'uni-app框架', '移动银行']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见的数据压缩算法

Deflate

gzip

bzip2

LZO

LZ4

Snappy

LZO和LZ4算法已经不再hadoop1.x

1)DEFLATW是同时使用LZ77算法和哈夫曼编码的一个无损数据压缩算法,源代码可以在zlib库中找到

gzip是以DEFLATW算法为基础扩展出来的一种算法

2)压缩算法都是空间和时间的转换,更快的压缩时间还是更小的压缩比,可以通过参数来制定

-1意味着速度,-9意味着空间。拿gzip来做个例子,下面就意味着更快速的压缩。

gzip -1 file

3)gzip在时间和空间上比较适中,bzip2压缩比gzip更有效,但速度更慢。

bzip2的压缩速度比它的压缩速度更快,但是和其他压缩格式相比又是最慢的,单

是压缩效果明显是组号的。snappy和LZ4d的压缩速度比LZ0好很多

4)splittable表示的是压缩格式是否可以被分割,也是就是否支持随机读。阿索数据是否被mapreduce使用,

压缩数据是否能被分割就很关键了。

存放压缩算法

/home/hadoop-1.2.1/src/core/org/apache/hadoop/io/compress


如何使用Snappy & Zlib

下载http://code.google.com/p/snappy/downloads/list


配置:

1)hadoop.native.lib参数

2)设置LD_LIBRAEY_PATH环境变量或者java.library.path属性

这两个路径必须包含hadoop native library 和snappy library

 hadoop native library(libhadoop.so)

$HADOOP_HOME/lib/native/Linux-amd64-64/

snappy library(libsnappy.so):/usr/local/lib/ (默认安装位置)


同样需要安装Zlib库,直接使用yum 命令安装zlib 、zlib-devel

在安装snappy1.1.1.tar.gz过程中可能会遇到一些问题

检查gcc-c++, autoconf, automake, libtool, Java 6, JAVA_HOME set, Maven 3

是否安装配置好

如果在make时出现错误二:./libtool: line 1125: g++: command not found错误

解决方案:sudo yum -y install gcc-c++

如果还是出现问题,将snappy1.1.1目录删除,重新解压缩

然后执行./configrue  make && make install

通过查看 ls /usr/local/lib下确认是否安装成功

通过代码来展示不同效果

Snappy压缩

public static void main(String[] args) throws ClassNotFoundException, IOException{
		String codecClassName ="org.apache.hadoop.io.compress.SnappyCodec";
		Class<?> cls = Class.forName(codecClassName);
		Configuration conf = new Configuration();
		CompressionCodec codec =(CompressionCodec)ReflectionUtils.newInstance(cls, conf);
		String inputFile = "/home/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();
		
	}


Bz2压缩

public static void main(String[] args) throws ClassNotFoundException, IOException{
		String codecClassName ="org.apache.hadoop.io.compress.BZip2Codec";
		Class<?> cls = Class.forName(codecClassName);
		Configuration conf = new Configuration();
		CompressionCodec codec =(CompressionCodec)ReflectionUtils.newInstance(cls, conf);
		String inputFile = "/home/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();
		
	}

BZ2的压缩比非常高,但是BZ2的压缩时间会比较长

deflate方式压缩比较快

public static void main(String[] args) throws ClassNotFoundException, IOException{
		String codecClassName ="org.apache.hadoop.io.compress.DefaultCodec";
		Class<?> cls = Class.forName(codecClassName);
		Configuration conf = new Configuration();
		CompressionCodec codec =(CompressionCodec)ReflectionUtils.newInstance(cls, conf);
		String inputFile = "/home/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();
		
	}

gzip压缩

public static void main(String[] args) throws ClassNotFoundException, IOException{
		String codecClassName ="org.apache.hadoop.io.compress.GzipCodec";
		Class<?> cls = Class.forName(codecClassName);
		Configuration conf = new Configuration();
		CompressionCodec codec =(CompressionCodec)ReflectionUtils.newInstance(cls, conf);
		String inputFile = "/home/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();
		
	}

怎么选择压缩算法:

1)用一些包含了压缩算法并制裁splittable的文件格式,比如Sequence File RCFIle或者Avro文件

2)使用提供splittable的压缩格式,比如bzip2和索引后可以制裁splittable的lzo

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值