对hbase数据进行压缩的算法很多,snappy、lz0,lz4,gz等。

压缩和不压缩相比,在写入时的编码速度和读时的解码速度都有一定的cpu损耗,但是在容量上都能降低30%甚至更多,就是一种用cpu计算来换空间的取舍。

这里我没用做过各种算法的性能对比,但在hbase中的使用中介于空间和cpu性能损耗之间都选择的snappy,看过很多生产环境hbase用的都是snappy压缩,当然其它场景如果需要更大的压缩率可以选择压缩率更大的算法

总之一句话,hbase适合使用snappy算法进行数据压缩。

1.编译环境

  • centos7
  • hadoop2.7
  • jdk1.8
  • maven3
  • hbase1.3
  • snappy1.1.3

2.编译顺序

编译snappy的过程比较痛苦,网上的很多资料都是互相抄或者翻译官网,没有实践过,按照他们写的一直不成功,下面的过程是自己一步步验证过的。下面的编译顺序很重要。

  • 1.安装snappy
  • 2.编译hadoop-snappy,生成jar和native文件
  • 3.编译hadoop,生成native文件
  • 4.将hadoop-snappy的jar和native文件拷贝到hadoop native中
  • 5.将hadoop native中的所有文件拷贝到hbase/lib/native/Linux-amd64-64中(一定要将hadoop native文件下hadoop自己的native和hadoop-snappy的jar都拷贝过来,只拷贝hadoop-snappy的native文件也会报错)
  • 6.将编译好的hadoop和hbase拷贝到其它集群机器上(其它机器不需要重新编译安装)

3.编译安装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”等就表明安装成功。

4.编译hadoop-snappy

下载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包

5.编译hadoop

这里编译用的hadoop版本是2.7.5
一定要在snappy安装成功后编译hadoop
编译hadoop看下面链接

编译好之后输入命令看是否支持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

6.拷贝jar和native文件

拷贝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目录

7.配置

core-site.xml

<property>  
  <name>io.compression.codecs</name>  
  <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.compress</name>    
    <value>true</value>    
</property>    
<property>    
    <name>mapred.output.compression.codec</name>    
    <value>org.apache.hadoop.io.compress.SnappyCodec</value>    
</property>    
<property>    
    <name>mapred.compress.map.output</name>    
    <value>true</value>    
</property>    
<property>    
    <name>mapred.map.output.compression.codec</name>    
    <value>org.apache.hadoop.io.compress.SnappyCodec</value>    
</property>

hbase-site.xml

<property>  
         <name>hbase.regionserver.codecs</name>  
         <value>snappy</value>  
    </property>

8.部署

将编译好的hadoop和hbase配置好之后,部署到其它集群机器上,不需要在其它集群机器上进行编译。

9.测试

hbase shell
create 'test',{NAME=>'cf',COMPRESSION='SNAPPY'}
put 'test','1','cf:f1','1'