为什么经常把hadoop的本地库和压缩一起说,原来hadoop是使用Java语言开发的,但是一些需求和操作并不适合使用java(性能问题)或某些java类库的缺失,所以就引入了本地库(c/c++编写)的概念,而压缩的一些格式就正好需要使用本地库。

1. 压缩

hadoop中为什么使用压缩,因为压缩既减少了占用磁盘的空间又加快了文件的传输速度。
hadoop中常用到的压缩格式有lzo,lz4,gzip,snappy,bzip2,关于这几种压缩格式的比较如下表

压缩格式

文件扩展名

是否可切分(split)

native

压缩率

速度

是否hadoop自带

linux命令

换成压缩格式后,原来的应用程序是否要修改

gzip

.gz



很高

比较快



和文本处理一样,不需要修改

lzo

.lzo



比较高

很快

否,需要安装


需要建索引,还需要指定输入格式

snappy

.snappy



比较高

很快

否,需要安装

没有

和文本处理一样,不需要修改

bzip2

.bz2



最高




和文本处理一样,不需要修改

hadoop中的codec实现了压缩-解压缩算法

压缩格式

对应的压缩-解压缩处理类

DEFLATE

org.apache.hadoop.io.compress.DefaultCodec

gzip

org.apache.hadoop.io.compress.GzipCodec

bzip2

org.apache.hadoop.io.compress.BZip2Codec

LZO

com.hadoop.compression.lzo.LzopCodec

LZ4

org.apache.hadoop.io.compress.Lz4Codec

Snappy

org.apache.hadoop.io.compress.SnappyCodec

实际使用举例:

按小时收集服务器日志,并且清洗数据后输出。

解决方案:

因为日志格式是文本文档且量大,所以收集后采用压缩率最高但是速度比较慢的bzip2格式压缩存储,并且bzip2格式压缩支持对输入文件的分片(虽然我们的数据还没到需要分片的地步),在MR执行任务时,会在读取时自动解压缩文件;同时可以对map任务的输出reduce的输出做bzip2格式的压缩处理。

2. 本地库(Native Libraries)

压缩使用native库往往比使用内置java实现压缩解压缩速度快。默认情况下,hadoop会搜索本地库,如果找到就会自动加载,但通常本地库因为版本的原因需要重新安装编译,所以如果使用gzip/LZO/Snappy格式之前需要安装相应库。
下表给出了每种压缩格式的java内置实现和原生库实现

压缩格式

是否hadoop自带java实现

是否有原生实现

DEFLATE



gzip



bzip2


LZO


LZ4


Snappy


可以使用hadoop checknative查看本地库的安装情况,截图显示已安装

hadoop临时库 hadoop本地库_压缩


以上待续…