常见的数据压缩算法
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的压缩格式存储一个很大的数据文件是不合适的,非本地处理效率会非常低。