对hbase数据进行压缩的算法很多,snappy、lz0,lz4,gz等。
压缩和不压缩相比,在写入时的编码速度和读时的解码速度都有一定的cpu损耗,但是在容量上都能降低30%甚至更多,就是一种用cpu计算来换空间的取舍。
这里我没用做过各种算法的性能对比,但在hbase中的使用中介于空间和cpu性能损耗之间都选择的snappy,看过很多生产环境hbase用的都是snappy压缩,当然其它场景如果需要更大的压缩率可以选择压缩率更大的算法
总之一句话,hbase适合使用snappy算法进行数据压缩。
编译snappy的过程比较痛苦,网上的很多资料都是互相抄或者翻译官网,没有实践过,按照他们写的一直不成功,下面的过程是自己一步步验证过的。下面的编译顺序很重要。
安装编译环境
yum -y install gcc c++ gcc-c++ autoconf automake libtool
下载snappy源代码
https://github.com/google/snappy/releases
下载1.1.4及以下版本,1.1.5以上要用cmake编译,不是很熟悉,这里我用的1.1.3
tar xzvf snappy-1.1.3
cd snappy-1.1.3
./configure
make
make install
安装好以后到/usr/local/lib下面查看有”libsnappy”等就表明安装成功。
下载hadoop-snappy源码
https://github.com/electrum/hadoop-snappy
git clone https://github.com/electrum/hadoop-snappy.git
cd hadoop-snappy
mvn clean package
编译完成后会在target文件里面生成编译成功的native文件和jar包
这里编译用的hadoop版本是2.7.5
一定要在snappy安装成功后编译hadoop
编译hadoop看下面链接
http://blog.csdn.net/dante_003/article/details/78855323
编译好之后输入命令看是否支持snappy
[root@ht05 lib]# hadoop checknative
17/12/21 14:22:20 WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version
17/12/21 14:22:20 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop: true /opt/hadoop/lib/native/libhadoop.so.1.0.0
zlib: true /lib64/libz.so.1
snappy: true /opt/hadoop/lib/native/libsnappy.so.1
lz4: true revision:99
bzip2: false
openssl: true /lib64/libcrypto.so
拷贝hadoop-snappy jar和native到hadoop
cp hadoop-snappy-0.0.1-SNAPSHOT.jar hadoop/lib
cp native/Linnux-amd64-64/* hadoop/lib/native
拷贝到hbase
cp hadoop-snappy-0.0.1-SNAPHOST.jar hbase/lib
mkdir -p hbase/lib/native/Linux-amd64-64
cp hadoop/lib/native/* hbase/lib/native/Linux-amd64-64
#注意这里拷贝的是linux-amd64-64文件夹到hbase的native文件夹下,因为hbase环境变量里面加载native包是Linux-amd64-64而不是native目录
core-site.xml
<property>
<name>io.compression.codecsname>
<value>org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec
value>
property>
mapre-site.xml
hadoop的mapreduce中间生成结果可以使用snappy压缩,shuffle时数据体积更小
<property>
<name>mapred.output.compressname>
<value>truevalue>
property>
<property>
<name>mapred.output.compression.codecname>
<value>org.apache.hadoop.io.compress.SnappyCodecvalue>
property>
<property>
<name>mapred.compress.map.outputname>
<value>truevalue>
property>
<property>
<name>mapred.map.output.compression.codecname>
<value>org.apache.hadoop.io.compress.SnappyCodecvalue>
property>
hbase-site.xml
<property>
<name>hbase.regionserver.codecsname>
<value>snappyvalue>
property>
将编译好的hadoop和hbase配置好之后,部署到其它集群机器上,不需要在其它集群机器上进行编译。
hbase shell
create 'test',{NAME=>'cf',COMPRESSION='SNAPPY'}
put 'test','1','cf:f1','1'