hbase支持snappy, lz4, bizp2,lzo,zstd等各种压缩。
hbase要支持上面各种压缩算法,要hdfs底层支持压缩才可以。hadoop 2.8.5 默认支持 GZ , snappy, lz4, bzip2四种压缩算法。 hadoop2.9.x 增加zstd。 本文思路根据官方文档 NativeLibraries来操作的。 大致思路是先把snappy的c++ lib库安装好,然后在重新编译hadoop 源代码,用编译生成的hadoop来重新安装集群。
前言
安装完hadoop以后发现 hadoop 的native库都没有关联上。
hadoop checknative -a
hadoop: false
zlib: false
snappy: false
lz4: false
bzip2: false
openssl: false
原因主要是我直接下载了hadoop官网已经编译好的二进制库安装的hadoop集群。很多native 库没有关联上。下面讲解重新编译hadoop源码安装hadoop过程。
安装前准备
注意编译hadoop源码的机器和最终安装hadoop集群的机器可以不是一台。但是编译hadoop源码机器的的lib库地址要和正式hadoop集群的lib库的地址一致(比如在编译hadoop源码机器的snappy的lib地址要和安装hadoop集群的机器的地址一致等)
1. centos6/aliyunos6
2. 确保安装JDK并配置JAVA_HOME的机器
安装教程见JDK安装教程, 配置环境变量不熟悉的可以自行查找资料。
3. 下载maven 3
这个直接在maven官网下载 解压缩就行,不用配置任何额外的环境变量。
4. yum install 需要的库
这些库大部分之编译的时候需要的,运行时候基本用不上,如果再启动hadoop的过程中真的遇到问题,那么可以再安装集群上也安装一些这些依赖。
yum install -y gcc c++
yum install gcc-c++
yum install -y autoconf
yum install -y automake
yum install -y libtool
yum install -y cmake
5. 安装protobuf 2.5.0
每个版本的hadoop依赖的protobuf版本都不一样,要想找到当前版本依赖protobuf的版本,那么可以
grep -R "protobuf" ./*
注意hadoop2.8.5编译的时候 依赖的protobuf版本只能是 2.5.0。否则会报
on project hadoop-common: org.apache.maven.plugin.MojoExecutionException: protoc version is 'libprotoc 2.6.1', expected version is '2.5.0'
错误。 如果版本不一样可以找到 protobuf2.6.1的安装目录然后执行下面命令删除历史版本。
./make clean
安装protobuf教程见 安装protobuf教程
6. 安装snappy lib
wget https://github.com/google/snappy/releases/download/1.1.3/snappy-1.1.3.tar.gz
tar -zxvf snappy-1.1.3.tar.gz
cd snappy-1.1.3
./configure
make
make install
# 默认安装目录
ls /usr/local/lib | grep sna
7. 下载hadoop-2.8.5源码
编译hadoop源码
/opt/wzapp/install/apache-maven-3.6.0/bin/mvn package -Pdist,native -DskipTests -Dtar -Drequire.snappy -Drequire.hadoop -Drequire.lz4 -Drequire.bzip2 -Drequire.zlib
时间大概要20分钟
重新安装hadoop集群
把hadoop-2.8.5-src/hadoop-dist/target/hadoop-2.8.5 这个目录压缩然后拷贝到集群各个节点,然后用老的配置文件覆盖过来。重启集群。
hadoop checknative -a
hadoop: true /opt/app/hadoop-2.8.5/lib/native/libhadoop.so
zlib: true /lib64/libz.so.1
snappy: true /usr/local/lib/libsnappy.so.1
lz4: true revision:10301
bzip2: true /lib64/libbz2.so.1
openssl: true /usr/local/ssl/lib/libcrypto.so
hbase 支持 snappy
# 注意Linux-amd64-64 目录需要自己创建
cp $HADOOP_HOME/lib/native $HBASE_HOME/lib/native/Linux-amd64-64 中
# 把 snappy 拷贝到 $HBASE_HOME/lib/native/Linux-amd64-64 中
cp /usr/local/lib/libsnappy* $HBASE_HOME/lib/native/Linux-amd64-64
# 修改 hbase-env.sh
export HBASE_LIBRARY_PATH=$HBASE_LIBRARY_PATH:$HBASE_HOME/lib/native/Linux-amd64-64/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/
#启动hbase cluster
create 'snappy-test', NAME=> 'cf', COMPRESSION => 'snappy'
create 'gz-test', NAME=> 'cf', COMPRESSION => 'GZ'
create 'lz4-test' , NAME=> 'cf', COMPRESSION => 'lz4'
坑
操作过程中如果遇到如下问题可以参考如下解决方法:
zlibc, bzip2, openssl 没装
安装 zlibc( ubuntu叫做 zlib1g zlib1g-dev)
http://www.zlib.net/
wget https://jaist.dl.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd /opt/moudles/Zlib/zlib-1.2.11/
./configure
make && make install
ll /usr/local/lib
bzip2
yum install lzo-devel zlib-devel bzip2
sudo yum install ncurses-devel gcc gcc-c++
wget https://jaist.dl.sourceforge.net/project/bzip2/bzip2-1.0.6.tar.gz
tar -zxvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6/
make -f Makefile-libbz2_so
make && make install
openssl lib
yum install openssl-devel
wget https://www.openssl.org/source/openssl-1.1.0j.tar.gz
tar -zxvf openssl-1.1.0j.tar.gz
cd openssl-1.1.0j
./config --prefix=/usr/local/
./config -t
make
make install
openssl version
protobuf 没安装问题
[protoc, --version] failed: java.io.IOException: Cannot run program "protoc": error=2, No such file or directory
安装protobuf, 方法见 protobuf安装
protobuf 版本不对
on project hadoop-common: org.apache.maven.plugin.MojoExecutionException: protoc version is 'libprotoc 2.6.1', expected version is '2.5.0'
如果版本不一样可以找到 protobuf2.6.1的安装目录然后执行下面命令删除历史版本。
./make clean
安装protobuf教程见 安装protobuf教程
automake 没安装
[ERROR] Failed to execute goal org.codehaus.mojo:make-maven-plugin:1.0-beta-1:autoreconf (compile) on project hadoop-common: autoreconf command returned an exit value != 0. Aborting build; see debug output for more information. ->
yum install autocong
yum install automake
yum install libtool
zlib没安装
configure: error: Zlib headers were not found... native-hadoop library needs zlib to build. Please install the requisite zlib development package.
yum install --reinstall zlibc zlib1g zlib1g-dev
IOException: Compression algorithm 'snappy' previously failed test
IOException: Compression algorithm 'snappy' previously failed test
这个问题分两步排查
执行 hadoop checknative -a, 看下是否hadoop的native lib完全配置(重点看snappy是否支持),如果不支持重回本文前面步骤,安装snappy
如果hadoop支持snappy,但是创建hbase表的时候不支持snappy,那么就简单了, 把snappy的 linux lib文件拷贝到 hbase lib/native/Linux-amd64-64 中,然后配合hbase的lib目录包含上面目录就ok了。
# 把 snappy 拷贝到 $HBASE_HOME/lib/native/Linux-amd64-64 中
cp /usr/local/lib/libsnappy* $HBASE_HOME/lib/native/Linux-amd64-64
# 修改 hbase-env.sh
export HBASE_LIBRARY_PATH=$HBASE_LIBRARY_PATH:$HBASE_HOME/lib/native/Linux-amd64-64/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/