一、配置编译环境

安装基本库

使用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

二、执行移植分析

  1. 将Hive安装包解压,如解压到/root/testchecksso文件夹下,使用CheckSo工具扫描Hive安装包。hive移植 - 图1
    扫描结束后,可以在CheckSo目录下的JarResult.log和NonJarResult.log,其中JarResult.log主要包含的是jar包及jar包中包含的so,NonJarResult.log包含的是so/*.a/可执行程序分析。
  2. 请依据《CheckSo 用户指南》扫描Hive安装包,分析得出需要移植的第三方依赖包如下表格。 | 原始jar | so文件 | | —- | —- | | commons-crypto-1.0.0.jar | libcommons-crypto.so | | netty-all-4.1.17.Final.jar | libnetty_transport_native_epoll_x86_64.so | | jline-2.12.jar | libjansi.so |

三、编译依赖库

请参考表 依赖包编译参考编译第三方依赖包,
表1 依赖包编译参考

依赖包名称 编译方法
netty-all-4.0.52.Final.jar 详细编译步骤请参考《netty-all-4.0.52.Final.jar 移植指南(CentOS 7.6)》
commons-crypto-1.0.0.jar 详细编译步骤请参考《commons-crypto-1.0.0.jar 移植指南(CentOS 7.6)》
jline-2.12.1.jar 详细编译步骤请参考《jline-2.11,2.12,2.12.1,2.14.3.jar 移植指南(CentOS 7.6)》

四、编译Hive

  1. 从Github上下载HDP3.1 Hive源码并解压。
    wget https://github.com/hortonworks/hive-release/archive/HDP-3.1.0.0-78-tag.tar.gz
    tar -zxf HDP-3.1.0.0-78-tag.tar.gz
    cd hive-release-HDP-3.1.0.0-78-tag
  2. 修改pom.xml内多处软件的版本号,确定编译过程能精准找到对应版本的软件包。
    sed -i ‘s/3.1.0-SNAPSHOT/3.1.0.3.1.0.0-78/g’ find . -name pom.xml
    sed -i ‘s/3.1.0.0-SNAPSHOT/3.1.0.0-78/g’ find . -name pom.xml
    sed -i s/2.6.1-SNAPSHOT/2.3.0.3.1.0.0-78/g pom.xml
    sed -i s/2.6.1-SNAPSHOT/2.3.0.3.1.0.0-78/g standalone-metastore/pom.xml
  3. 修改pom.xml,在文件第223行,添加maven仓库源。vim pom.xml

    <repository>
    <id>kunpengmaven</id>
    <name>kunpeng maven</name>
    <url>https://mirrors.huaweicloud.com/kunpeng/maven</url>
    </repository>
    <repository>
    <id>hortonworksmaven</id>
    <name>hortonworks maven</name>
    <url>https://repo.hortonworks.com/content/repositories/releases</url>
    </repository>
    

    hive移植 - 图2

  4. 按ESC键,输入:wq保存并退出。

  5. 执行编译。
    mvn package -DskipTests -Pdist -Dtar
  6. 编译完成后在packaging/target目录下生成tar.gz包。hive移植 - 图3

五、制作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包

hive移植 - 图4须知:
如下操作在X86服务器上执行。

  1. 下载X86 版本的HDP 安装包(该安装包包含所有组件的rpm)。
    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. 下载tools.zip压缩包并解压,该压缩包包含:
  • rebuild.sh —该脚本功能主要负责是负责对rpm包的spec文件的提取和rpm包打包功能。
  • CheckSo工具—主要是扫描rpm包里面包含哪些so、jar包、bin执行文件。
  1. 从HDP解压的组件包里拷贝Hive对应的rpm包到指定目录(假设“/opt/HDP/rpm/hive/”)。
  2. 执行rebuild.sh来对hive的rpm包进行spec文件生成。
    ./rebuild.sh rebuild /opt/HDP/rpm/hive/
    hive移植 - 图5
    hive移植 - 图6说明:
    rebuild过程中可能会提示需要安装libtirpc和libtirpc-devel,自行安装即可。
  3. spec文件生成完后会在当前目录下生成workdir目录,workdir/*.rpm/下存放的是各个rpm文件的spec文件。hive移植 - 图7

    检查rpm包的so文件、jar包

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

  4. 将上述生成的几个spec文件拷贝到ARM服务器上备用,并将hive的rpm文件拷贝到某个目录下,如“/opt/HDP/rpm/hive/”。

  5. 解压前文获取的CheckSo工具。hive移植 - 图9
  6. 删除checkSo文件夹中的临时结果文件。
    rm -rf result/*
    rm -rf temp_unzip_dir/*
    rm -rf tmp_unzip/*
  7. 执行脚本检查rpm包是否包含有so的jar包、so、可执行bin文件等。
    ./checkrpm.sh /opt/HDP/rpm/hive/
    hive移植 - 图10
  8. 执行完以后在result目录下生成对应的检查结果,其中,BinResult.log:记录需要替换的so文件及其所在的jar包
    DirResult.log:记录包含x86的目录
    JarResult.log 记录需要替换的jar包
    hive移植 - 图11
    out.csv 该文件为BinResult.log,DirResult.log,JarResult.log文件的结果汇总
    hive移植 - 图12

    制作rpm包

    hive移植 - 图13须知:
    如下操作在ARM服务器上执行。
    以下以hive_3_1_0_0_78-3.1.0.3.1.0.0-78.noarch.rpm为例,制作rpm包。

  9. 对hive_3_1_0_0_78-3.1.0.3.1.0.0-78.noarch.rpm进行解压。hive移植 - 图14
    #mkdir hive_3_1_0_0_78-3.1.0.3.1.0.0-78.noarch
    #cd hive_3_1_0_0_78-3.1.0.3.1.0.0-78.noarch
    #cp hive的rpm包所在路径/hive_3_1_0_0_78-3.1.0.3.1.0.0-78.noarch.rpm .
    #rpm2cpio hive_3_1_0_0_78-3.1.0.3.1.0.0-78.noarch.rpm | cpio -idv

  10. 解压后,当前文件夹下会生成usr文件夹,将上述hive_3_1_0_0_78-3.1.0.3.1.0.0-78.noarch.rpm生成的spec文件拷贝到当前目录下。hive移植 - 图15
  11. 替换out.csv中相应路径下的jar包,so文件为aarch64版本。
  12. 创建打包目录(目录/root/rpmbuild/BUILDROOT/是固定的,不可更改。
    mkdir -p /root/rpmbuild/BUILDROOT/hive_3_1_0_0_78-3.1.0.3.1.0.0-78.aarch64
  13. 拷贝需要打包的文件到步骤4创建的目录中。
    cp -rd usr /root/rpmbuild/BUILDROOT/hive_3_1_0_0_78-3.1.0.3.1.0.0-78.aarch64
  14. 打包rpm。rpmbuild -ba hive_3_1_0_0_78.spec
    hive移植 - 图16
  15. rpm生成在/root/rpmbuild/RPMS下和/root/rpmbuild/SRPMS目录下。hive移植 - 图17


六、故障排除

问题1:编译过程中报错:“Could not find artifact com.google.protobuf:protoc:exe:linux-aarch_64:2.5.0”

问题现象
编译过程中报错:“Could not find artifact com.google.protobuf:protoc:exe:linux-aarch_64:2.5.0”。hive移植 - 图18
解决方法
需要参考hadoop的编译指导中编译protobuf 2.5.0,将编译出来的protoc(在src目录下)拷贝到本地maven仓库中(/root/.m2/repository/com/google/protobuf/protoc/2.5.0/),并命名为protoc-2.5.0-linux-aarch_64.exe。

问题2:编译过程中提示不能在远程仓库下载hadoop-yarn-server.2.7.3.2.6.0.3-8.pom和hadoop-yarn-server.2.7.3.2.6.0.3-8.jar

问题现象
编译过程中提示不能在远程仓库下载hadoop-yarn-server.2.7.3.2.6.0.3-8.pom和hadoop-yarn-server.2.7.3.2.6.0.3-8.jar。
hive移植 - 图19
解决方法
手动到远程仓库下载该文件后,放到本地仓库提示中的相关路径下,如本地仓库目录为~/.m2,则将该文件放到~/.m2/repository/org/apache/hadoop/hadoop-yarn-server/2.7.3.2.6.0.3-8/目录下(其他类似问题,解决方法与此类似)。

问题3:编译过程中提示不能在远程仓库下载zkclient-0.10.jar和zkclient-0.10.pom

问题现象
编译过程中提示不能在远程仓库下载zkclient-0.10.jar和zkclient-0.10.pom。
hive移植 - 图20
hive移植 - 图21
解决方法
手动到远程仓库下载该文件后,放到本地仓库提示中的相关路径下,如本地仓库目录为~/.m2,则将该文件放到~/.m2/repository/com/101tec/zkclient/1.10/目录下(其他类似问题,解决方法与此类似)。

问题4:提示在http://www.datanucleus.org/downloads/maven2仓库中没有找到slf4j-api-1.7.25.jar文件

问题现象
提示在http://www.datanucleus.org/downloads/maven2仓库中没有找到slf4j-api-1.7.25.jar文件。
hive移植 - 图22
解决方法
http://www.datanucleus.org/downloads/maven2与本地maven仓库中配置的不同,且手动去该网址上没有找到slf4j-api的jar包和pom文件(在maven仓https://repo1.maven.org/maven2下找到了该jar包和pom文件),在hive源码目录下搜索配置该网址的地方,发现在pom.xml文件的227行有配置该网址,将227行的url修改为maven仓的路径后,重新执行编译。
hive移植 - 图23
hive移植 - 图24