编译hadoop源码支持hadoop native lib

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-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/
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
慷慨打赏