一、配置编译环境

安装基本库

使用yum安装。
yum install wget patch openssl-devel zlib-devel automake libtool make cmake libstdc++-static glibc-static git gcc gcc-c++

安装OpenJDK

下载OpenJDK源码并安装到指定目录(如“/opt/tools/installed”)。
wget https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u191-b12/OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gz

tar -zxf OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gz
mv jdk8u191-b12 /opt/tools/installed/

配置java环境变量,在“/etc/profile”文件末尾处增加下面的代码。
export JAVA_HOME=/opt/tools/installed/jdk8u191-b12
export PATH=$JAVA_HOME/bin:$PATH
按ESC键,输入:wq保存并退出。
运行下面命令,使修改的环境变量生效。
source /etc/profile

安装Maven

下载并安装到指定目录(如“/opt/tools/installed”)。
wget https://archive.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz

tar -zxf apache-maven-3.5.4-bin.tar.gz
mv apache-maven-3.5.4 /opt/tools/installed/

修改Maven环境变量,在/etc/profile文件末尾增加下面代码。
export MAVEN_HOME=/opt/tools/installed/apache-maven-3.5.4
export PATH=$MAVEN_HOME/bin:$PATH

运行下面的命令,是修改的环境变量生效。
source /etc/profile

修改Maven配置文件中的:本地仓路径、远程仓等。
配置文件路径:“/opt/tools/installed/apache-maven-3.5.4/conf/settings.xml”
本地仓库配置:

  1. <localRepository>/path/to/local/repo</localRepository>

说明:
本地仓库地址默认在“~/.m2/”目录下,如果想修改成指定目录,则修改localRepository标签,没有特殊需求,可不必修改该参数。

  1. <mirror>
  2. <id>huaweimaven</id>
  3. <name>huawei maven</name>
  4. <url>https://mirrors.huaweicloud.com/repository/maven/</url>
  5. <mirrorOf>central</mirrorOf>
  6. </mirror>

远程仓库配置(修改成自己搭建的Maven仓库,如果没有,可以下面配置):

  1. <mirror>
  2. <id>huaweimaven</id>
  3. <name>huawei maven</name>
  4. <url>https://mirrors.huaweicloud.com/repository/maven/</url>
  5. <mirrorOf>central</mirrorOf>
  6. </mirror>

当编译环境不能访问外网,需要在settings.xml配置文件中添加代理配置,具体内容如下:

  1. <proxies>
  2. <proxy>
  3. <id>optional</id>
  4. <active>true</active>
  5. <protocol>http</protocol>
  6. <username>用户名</username>
  7. <password>密码</password>
  8. <host>代理服务器网址</host>
  9. <port>代理服务器端口</port>
  10. <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
  11. </proxy>
  12. </proxies>

安装GCC

挂载OS镜像。
mount YOUR_OS.iso /media -o loop

说明:
YOUR_OS.iso用实际的iso包名代替。

备份yum repo文件,清空/etc/yum.repos.d/目录文件。
cp -r /etc/yum.repos.d /etc/yum.repos.d-bak
rm /etc/yum.repos.d/*

须知:
请确认已经备份所有repo文件后,在rm删除界面输入y表示同意删除。

修改/etc/yum.repos.d/local.repo文件,配置yum本地源。

  1. [Local]
  2. name=CentOS-7.6 Local
  3. baseurl=file:///media/
  4. enabled=1
  5. gpgcheck=0

运行下面的命令,使yum源配置生效。
yum clean all
yum makecache

yum安装GCC相关软件。
yum -y install gcc.aarch64 gcc-c++.aarch64 gcc-gfortran.aarch64 libgcc.aarch64

安装cmake

Hadoop编译要求3.12及以上版本,本文以安装cmake 3.12.4版本为例。

下载cmake安装包。
wget https://cmake.org/files/v3.12/cmake-3.12.4.tar.gz

解压安装包。
tar -zxf cmake-3.12.4.tar.gz

编译安装cmake。
cd cmake-3.12.4
./bootstrap
make -j8
make install

安装Protoc

下载并解压源码。
wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz
tar -zxf protobuf-2.5.0.tar.gz
mv protobuf-2.5.0 /opt/tools/installed/
cd /opt/tools/installed/protobuf-2.5.0

安装依赖库。
yum -y install patch automake libtool

上传protoc.patch到服务器,打补丁,其中protoc.patch的路径视实际情况而定。
cp protoc.patch ./src/google/protobuf/stubs/
cd ./src/google/protobuf/stubs/
patch -p1 < protoc.patch
cd -

patch补丁下载路径:
https://mirrors.huaweicloud.com/kunpeng/archive/kunpeng_solution/bigdata/Patch/protoc.zip

编译并安装到系统默认目录。
./autogen.sh && ./configure CFLAGS=’-fsigned-char’ && make -j8 && make install

二、执行移植分析

请依据《CheckSo 用户指南》扫描Hbase安装包,分析得出需要移植的第三方依赖包如下表格。

原始jar so文件
commons-crypto-1.0.0.jar libcommons-crypto.so
netty-all-4.0.52.Final.jar libnetty-transport-native-epoll.so
leveldbjni-all-1.8.jar libleveldbjni.so
snappy-java-1.0.5.jar libsnappyjava.so
hbase-shaded-netty-2.1.0.jar liborg_apache_hbase_thirdparty_netty_transport_native_epoll_x86_64.so

三、编译依赖库

  1. 请参考表 依赖包编译参考编译第三方依赖包。表1 依赖包编译参考 | 依赖包名称 | 编译方法 | | —- | —- | | netty-all-4.0.52.Final.jar | 详细编译步骤请参考《netty-all-4.0.52.Final.jar 移植指南(CentOS 7.6)》。 | | leveldbjni-all-1.8.jar | 详细编译步骤请参考《leveldbjni-all-1.8.jar 移植指南(CentOS 7.6)》。 | | snappy-java-1.0.5.jar | 详细编译步骤请参考《snappy-java-1.0.4.1,1.0.5 移植指南(CentOS 7.6)》。 | | hbase-shaded-netty-2.1.0.jar | 详细编译步骤请参考《Hbase-shaded-netty-2.1.0 移植指南(CentOS 7.6)》。 | | commons-crypto-1.0.0.jar | 详细编译步骤请参考《commons-crypto-1.0.0.jar 移植指南(CentOS 7.6)》。 |
  1. 请将编译完成的jar包替换到自己搭建的maven仓库和本地仓库中。


四、编译HBase

  1. 从Github上下载HDP3.1 HBase源码并解压。
    wget https://github.com/hortonworks/hbase-release/archive/HDP-3.1.0.0-78-tag.tar.gz
    tar -zxf HDP-3.1.0.0-78-tag.tar.gz
  2. 进入Hbase源码解压目录。cd hbase-release-HDP-3.1.0.0-78-tag
  3. 修改pom.xml,在文件第1369行,修改spark.version。vim pom.xml

2.3.2.3.1.0.0-78
hbase移植 - 图1

  1. 修改pom.xml,在文件第3738行,添加maven仓库源,然后删除文件第3748-3758行。vim pom.xml

    1. <repository>
    2. <id>kunpengmaven</id>
    3. <name>kunpeng maven</name>
    4. <url>https://mirrors.huaweicloud.com/kunpeng/maven</url>
    5. </repository>
    6. <repository>
    7. <id>hortonworksmaven</id>
    8. <name>hortonworks maven</name>
    9. <url>https://repo.hortonworks.com/content/repositories/releases</url>
    10. </repository>

    hbase移植 - 图2

  2. 修改hbase-client/pom.xml、hbase-shaded/hbase-shaded-client/pom.xml、hbase-external-blockcache/pom.xml,移除jsr305。三个文件添加的内容均相同,如下所示:

    1. <exclusions>
    2. <exclusion>
    3. <groupId>com.google.code.findbugs</groupId>
    4. <artifactId>jsr305</artifactId>
    5. </exclusion>
    6. </exclusions>

    vim hbase-client/pom.xml (有两处需要添加)
    hbase移植 - 图3
    hbase移植 - 图4
    vim hbase-shaded/hbase-shaded-client/pom.xml
    hbase移植 - 图5
    vim hbase-external-blockcache/pom.xml
    hbase移植 - 图6

  3. 执行编译命令。
    mvn package -DskipTests assembly:single
    编译成功如下图所示。
    hbase移植 - 图7

  4. 编译完成后在hbase-assembly/target/目录下生成tar.gz包。hbase移植 - 图8


五、制作rpm包

安装rpmbuild工具

在鲲鹏平台安装rpmbuild工具。

  1. 下载rpmbuild工具的rpm包。
    wget http://rpmfind.net/linux/fedora/linux/releases/31/Everything/aarch64/os/Packages/r/rpmrebuild-2.11-12.fc31.noarch.rpm
  2. 安装rpmbuild工具。rpm -ivh rpmrebuild-2.11-12.fc31.noarch.rpm

**

分析X86 rpm包

须知:
如下操作在X86服务器上执行。

  1. 下载X86 版本的HDP 安装包。
    wget http://public-repo-1.hortonworks.com/HDP/centos7/3.x/updates/3.1.0.0/HDP-3.1.0.0-centos7-rpm.tar.gz
    tar -xf HDP-3.1.0.0-centos7-rpm.tar.gz
  2. 根据《Ambari 2.7.3 部署指南(CentOS 7.6)》3.9章节配置本地HDP源。
  3. 下载相关工具压缩包并解压。https://mirrors.huaweicloud.com/kunpeng/archive/kunpeng_solution/bigdata/Tools/tools.zip
  • rebuild.sh —该脚本功能主要负责是负责对rpm包的spec文件的提取和rpm包打包功能。
  • checkso工具 —主要是扫描rpm包里面包含哪些so、jar包、bin执行文件。
  1. 从HDP解压的组件包里拷贝Hbase对应的rpm包到指定目录(假设“/opt/rpmtest/HDP/hbase/”)。hbase移植 - 图9
  2. 执行rebuild.sh来对hbase的rpm包进行spec文件生成。
    ./rebuild.sh rebuild /opt/rpmtest/HDP/hbase/
    hbase移植 - 图10
    会在当前目录下创建workdir目录,并生成对应的rpm包的spec文件,存放在指定目录。
    hbase移植 - 图11

    检查rpm包的so文件、jar包

    hbase移植 - 图12须知:
    如下操作在ARM服务器上执行。

  3. 将上述生成的几个spec文件拷贝到ARM服务器上。

  4. 解压上面获取的checkso工具。hbase移植 - 图13
  5. 删除checkSo文件夹中的临时结果文件。
    rm -rf result/*
    rm -rf temp_unzip_dir/*
    rm -rf tmp_unzip/*
  6. 执行脚本检查rpm包是否包含有so的jar包、so、可执行bin文件等。
    ./checkrpm.sh /opt/rpmtest/HDP/hbase/
  7. 执行完以后在result目录下生成对应的检查结果。hbase移植 - 图14
    查看发现只有hbase_3_1_0_0_78-2.0.2.3.1.0.0-78.noarch.rpm包含有so的jar包

    1. vim result/JarResult.log #记录包含哪些含有so的jar包hbase移植 - 图15
    2. vim result/out.csv #该文件主要记录需要替换jar包的路径hbase移植 - 图16

      制作rpm包

      hbase移植 - 图17须知:
      如下操作在ARM服务器上执行。
  8. 对hbase_3_1_0_0_78-2.0.2.3.1.0.0-78.noarch.rpm进行解压。
    mkdir tmprpm
    cd tmprpm
    cp -r /opt/rpmtest/HDP/hbase/hbase_3_1_0_0_78-2.0.2.3.1.0.0-78.noarch.rpm .
    rpm2cpio hbase_3_1_0_0_78-2.0.2.3.1.0.0-78.noarch.rpm | cpio -idv
    hbase移植 - 图18

  9. 替换上面扫描的jar文件为aarch64版本(tmprpm/usr/hdp/3.1.0.0-78/hbase/lib/)。hbase移植 - 图19
  10. 创建打包目录。
    mkdir -p /root/rpmbuild/BUILDROOT/hbase_3_1_0_0_78-2.0.2.3.1.0.0-78.aarch64
    hbase移植 - 图20须知:
    目录“/root/rpmbuild/BUILDROOT/”是固定的,不可更改。
  11. 拷贝需要打包的文件到上述目录中。
    cp -rd usr /root/rpmbuild/BUILDROOT/hbase_3_1_0_0_78-2.0.2.3.1.0.0-78.aarch64/
  12. rpm打包(spec文件是在上面x86服务器上解析获取)。
    rpmbuild -ba /opt/rpmtest/workdir/hbase_3_1_0_0_78-2.0.2.3.1.0.0-78.noarch.rpm/hbase_3_1_0_0_78.spec
    hbase移植 - 图21
  13. 生成的rpm包在/root/rpmbuild/RPMS/noarch/路径下。hbase移植 - 图22


六、故障排除

问题1:提示加载mojo ‘findbugs’失败,导致执行默认的findbugs-maven-plugin失败

问题现象
编译过程中报错:Failed to execute goal org.codehaus.mojo:findbugs-maven-plugin:3.0.0:findbugs (default) on project hbase: Execution default of goal org.codehaus.mojo:findbugs-maven.。
hbase移植 - 图23
解决方法
修改使用的findbugs-maven-plugin版本为3.0.4。
hbase移植 - 图24

问题2:编译报错:we don’t allow the JSR305 jar from the Findbugs project

问题现象
编译过程中报错:Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M1:enforce (banned-jsr305) on project hbase-client: Some Enforcer rules have failed.。
hbase移植 - 图25
解决方法
参考https://issues.apache.org/jira/browse/HBASE-16321 ,maven-enforcer-plugin插件用于对项目环境按照设定的规则进行检查,这里hbase主工程会跟子模块依赖jsr305 jar包冲突,设置了禁用规则,虽然HBASE-16321已经提供了相应的补丁,用于解决这个问题,而且hbase-release-HDP-3.1.0.0-78版本也已经打过补丁,但是仍然会报这个错误,所以判断是子模块里仍然存在相关的依赖没有移除jsr305。
整个工程存在这个问题的有三个子模块hbase-client、hbase-external-blockcache、hbase-shaded-client,需要修改相应的pom文件,对应的dependency处添加如下内容

  1. <exclusions>
  2. <exclusion>
  3. <groupId>com.google.code.findbugs</groupId>
  4. <artifactId>jsr305</artifactId>
  5. </exclusion>
  6. </exclusions>

两种解决方法:

  • 方法一:在编译命令加上validate -Denforcer.skip=true 参数,跳过enforcer检查。
  • 方法二:修改pom文件,操作步骤如下所示。
    1. vim hbase-client/pom.xmlhbase移植 - 图26
    2. vim hbase-shaded/hbase-shaded-client/pom.xmlhbase移植 - 图27
    3. vim hbase-external-blockcache/pom.xmlhbase移植 - 图28


问题3:编译报错: Could not transfer artifact org.apache.spark:spark-core_2.11:pom:2.3.2.3.1.0.0-77

问题现象
编译过程中报错:Could not resolve dependencies for project org.apache.hbase:hbase-spark:jar:2.0.2.3.1.0.0-78: The following artifacts could not transfer org.apache.spark:spark-core_2.11:pom:2.3.2.3.1.0.0-77.
hbase移植 - 图29
解决方法
修改hbase-release-HDP-3.1.0.0-78-tag/pom.xml,将spark版本号修改为2.3.2.3.1.0.0-78
hbase移植 - 图30

问题四:编译报错:Failed to read artifact descriptor for org.apache.hadoop:hadoop-common:jar:3.1.1.3.1.0.0-78(类似的现象可以参考这种方法解决)

问题现象
hbase移植 - 图31
问题分析
HDP的Maven镜像库网络访问比较缓慢,有可能因为网络下载不稳定,网络中断导致编译失败。
解决方法
方法一:
下载对应的jar包放到本地仓库。
wget https://repo.hortonworks.com/content/repositories/releases/org/apache/hadoop/hadoop-common/3.1.1.3.1.0.0-78/hadoop-common-3.1.1.3.1.0.0-78.pom —no-check-certificate
wget https://repo.hortonworks.com/content/repositories/releases/org/apache/hadoop/hadoop-common/3.1.1.3.1.0.0-78/hadoop-common-3.1.1.3.1.0.0-78.jar —no-check-certificate
拷贝下载的文件到本地仓库。
cp hadoop-common-3.1.1.3.1.0.0-78.jar /root/.m2/repository/org/apache/hadoop/hadoop-common/3.1.1.3.1.0.0-78
cp hadoop-common-3.1.1.3.1.0.0-78.pom /root/.m2/repository/org/apache/hadoop/hadoop-common/3.1.1.3.1.0.0-78
方法二:
cd /root/.m2/repository/org/apache/hadoop/hadoop-common/
把下载的中间文件删除,然后重新下载,如此反复直到网络下载成功。
hbase移植 - 图32