目录

为什么要编译 native 库安装工具包安装 zlib,bzip2,lz4安装 openssl安装 JDK8,maven安装 cmake安装 protobuf安装 snappy安装 zstd安装 isa-l安装 aws-DynamoDBLocal 包安装 aws-java-sdk-bundle 包编译 native 库验证踩坑总结

为什么要编译 native 库

hadoop 二进制包是提供预编译的 native 库,但是 32 位的,服务器基本是 64 位,所以需要重新编译 native 库,而且要在这个重新编译的 native 库绑定 snappy,bizp2,lz4 这些压缩算法,以及 zstd , 这个是 facebook 出品压缩算法,还有 isa-l 纠删码,openssl。

安装工具包

yum install -y gcc gcc-c++ automake autoconf libtool yasm nasm

安装 zlib,bzip2,lz4

yum install -y bzip2 bzip2-devel zlib zlib-devel lz4 lz4-devel

安装 openssl

yum install -y openssl-devel

安装 JDK8,maven

jdk8 安装 jdk8 这里用华为的 openjdk, 华为的 openjdk 下载地址: https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_jdk/bisheng-jdk-8u322-linux-x64.tar.gz 安装:

tar xzvf bisheng-jdk-8u322-linux-x64.tar.gz

mv bisheng-jdk1.8.0_322 open-jdk

mv open-jdk /usr/local/lib

maven 下载地址: https://dlcdn.apache.org/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.tar.gz 安装:

tar xzvf apache-maven-3.8.5-bin.tar.gz

mv apache-maven-3.8.5-bin maven

mv maven /usr/local/lib

初始化 maven 仓库

mvn help:effective-settings

设置 maven 国内镜像,这个一定要设置

cp /usr/local/lib/maven/conf/settings.xml /root/.m2/

打开 /root/.m2/settings.xml,查找 mirrors,插入以下内容:

nexus-tencentyun

*

Nexus tencentyun

http://mirrors.cloud.tencent.com/nexus/repository/maven-public/

设置环境变量 在 /etc/profile 添加:

export JAVA_HOME=/usr/local/lib/open-jdk

export E2_HOME=/usr/local/lib/maven

export PATH=$JAVA_HOME/bin:$E2_HOME/bin:$PATH

使环境变量生效

source /etc/profile

验证一下

java -version

mvn -version

看到下面输出安装成功

安装 cmake

下载地址:https://cmake.org/files/v3.1/cmake-3.1.0-Linux-x86_64.tar.gzz

编译安装

tar xzvf cmake-3.1.0-Linux-x86_64.tar

cd cmake-3.1.0-Linux-x86_64

cp -r share/* /usr/share/

cp bin/* /usr/bin/

验证一下

cmake -version

看到下面输出安装成功

安装 protobuf

这里一定要注意:hadoop 3.2.3 需要的 protobuf 版本是 2.5.0 下载地址: https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz

编译安装

./autogen.sh

./configure

make

make install

验证一下

protoc --version

看到下面输出安装成功

安装 snappy

下载地址 https://github.com/google/snappy/archive/refs/tags/1.1.7.tar.gz

编译安装

tar xf 1.1.7.tar.gz

cd snappy-1.1.7

mkdir -p build

cd build

cmake ..

make install

cd ..

cp build/libsnappy.a /usr/lib

cp build/snappy-stubs-public.h /usr/include/

cp snappy-c.h /usr/include/

cp snappy.h /usr/include/

验证一下

ls -lh /usr/lib64/ | grep snappy

看到下面输出安装成功

安装 zstd

下载地址 https://codeload.github.com/facebook/zstd/tar.gz/refs/tags/v1.4.10

编译安装

tar xzvf zstd-1.4.10.tar.gz

cd zstd-1.4.10

make && make install

验证一下 zstd 安装在 /usr/local/lib

ls /usr/local/lib | grep zstd

看到下面输出安装成功

安装 isa-l

下载地址 https://codeload.github.com/intel/isa-l/tar.gz/refs/tags/v2.30.0

编译安装

tar xzvf isa-l-2.30.0.tar.gz

cd isa-l-2.30.0

./autogen.sh

./configure --prefix=/usr --libdir=/usr/lib64

make

make install

验证一下 isal 安装在 /usr/lib64

ls /usr/lib64/ | grep isal

看到下面输出安装成功

安装 aws-DynamoDBLocal 包

下载地址 jar 包 https://s3-us-west-2.amazonaws.com/dynamodb-local/release/com/amazonaws/DynamoDBLocal/1.11.86/DynamoDBLocal-1.11.86.jar pom 文件 https://s3-us-west-2.amazonaws.com/dynamodb-local/release/com/amazonaws/DynamoDBLocal/1.11.86/DynamoDBLocal-1.11.86.pom

将 jar 包和 pom 文件移动到 maven 仓库

mkdir -p ~/.m2/repository/com/amazonaws/DynamoDBLocal/1.11.86

mv DynamoDBLocal-1.11.86.jar ~/.m2/repository/com/amazonaws/DynamoDBLocal/1.11.86

mv DynamoDBLocal-1.11.86.pom ~/.m2/repository/com/amazonaws/DynamoDBLocal/1.11.86

安装 aws-java-sdk-bundle 包

下载地址 https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/1.11.901/aws-java-sdk-bundle-1.11.901.jar

maven 手动安装 jar 包

mvn install:install-file -Dfile=aws-java-sdk-bundle-1.11.901.jar -DgroupId=com.amazonaws -DartifactId=aws-java-sdk-bundle -Dversion=1.11.901 -Dpackaging=jar

编译 native 库

mvn clean package -DskipTests -Pdist,native -Dtar -Dbundle.snappy=true -Drequire.snappy=true -Dsnappy.prefix=/usr/lib64 -Dsnappy.lib=/usr/lib64 -Drequire.zstd=true -Dbundle.zstd=true -Dzstd.lib=/usr/local/lib -Dbundle.isal=true -Drequire.isal=true -Disal.prefix=/usr/lib64 -Disal.lib=/usr/lib64

解释下上面的参数 Pdist,native :编译生成 hadoop 动态库 DskipTests :跳过测试 Dtar :以tar打包 Dbundle.snappy: 添加 snappy 压缩支持 Dsnappy.lib: snappy 库路径

最后大概编译了 20 多分钟

验证

ll hadoop-3.2.3-src/hadoop-dist/target

这个就是编译完成的二进制包

把它解压一下

cp hadoop-3.2.3.tar.gz ~/

tar xzvf hadoop-3.2.3.tar.gz

cd hadoop-3.2.3

bin/hadoop checknative

可以看到 zlib,zstd,snappy,lz4,bzip2,isa-l 都已经绑定到 native 库

踩坑总结

磁盘空间不够

解决:最好预定 3-4 G 的磁盘空间

国内 maven 镜像没有 亚马逊的依赖

解决:下载亚马逊的依赖 jar 包,然后 maven 手动安装到本地仓库

protobuff 版本不对

解决:hadoop 3.2.3 对应的 protobuff 版本是 2.5.0

snappy 没安装成功

解决:这个错误主要针对 snappy 的二进制安装,没有将 snappy 的头文件移动到 /usr/include 中。这里要将 snappy 二进制包中的 snappy-c.h 移动到 /usr/include

搞定,希望能给个赞。

查看原文