一、配置编译环境

安装基本库

使用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工具扫描hadoop的rpm包, 该工具主要用于扫描安装包中是否包含了X86的jar包/so/可执行程序等。
其中,HDP 3.1.0 x86 rpm包下载地址,Hadoop的rpm包含在HDP 3.1.0 rpm包中:
http://public-repo-1.hortonworks.com/HDP/centos7/3.x/updates/3.1.0.0/HDP-3.1.0.0-centos7-rpm.tar.gz
具体使用方法如下:

  1. 执行扫描命令。hadoop移植 - 图1
  2. 扫描结束后,可以在checkSo目录下的JarResult.log和NonJarResult.log。
    1. JarResult.log主要包含的是jar包及jar包中包含的so文件:hadoop移植 - 图2
    2. NonJarResult.log包含的是so/*.a/可执行程序:hadoop移植 - 图3
    3. 汇总分析得出以下jar包需要重新编译:leveldbjni-all-1.8.jar
      netty-all-4.0.52.Final.jar
      snappy-java-1.0.5.jar
      commons-crypto-1.0.0.jar
      lz4-1.2.0.jar
      wildfly-openssl-1.0.4.Final.jar
  3. 其他的jar包或者库/可执行程序可以通过编译hadoop得到。这里需要注意的是,编译hadoop前,需要重新编译以上列出的jar包,编译过程中会将重新编译的jar包放入本地maven仓库中,然后执行hadoop编译。

三、编译依赖库

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

依赖包名称 编译方法
leveldbjni-all-1.8.jar 编译步骤请参考《leveldbjni-all-1.8.jar 移植指南(CentOS 7.6)》
netty-all-4.0.52.Final.jar 编译步骤请参考《netty-all-4.0.52.Final.jar 移植指南(CentOS 7.6)》
snappy-java-1.0.5.jar 编译步骤请参考《snappy-java-1.0.4.1,1.0.5 移植指南(CentOS 7.6)》
commons-crypto-1.0.0.jar 编译步骤请参考《commons-crypto-1.0.0.jar 移植指南(CentOS 7.6)》
lz4-1.2.0.jar 编译步骤请参考《lz4-java-x.x.x.jar 移植指南(CentOS 7.6)》
wildfly-openssl-1.0.4.Final.jar 编译步骤请参考《wildfly-openssl-1.0.4.Final.jar移植指南》

四、编译Hadoop

注意:

  1. 编译过程中遇到问题可以参考故障排除
  2. 第一次编译的时候会从远程仓库下载jar包到本地仓库,但是那个jar包是X86的,所以在hadoop编译完成及第5章的jar包编译完成后,需要将第5章编译的jar包替换掉本地仓库中相应路径的jar包,然后重新编译一次hadoop。第二次编译会很快,所以不用担心。


  1. 从Github上下载HDP3.1 Hadoop源码并解压。wget https://github.com/hortonworks/hadoop-release/archive/HDP-3.1.0.0-78-tag.tar.gz
    tar -zxvf HDP-3.1.0.0-78-tag.tar.gz
  2. 进入hadoop源码解压目录。cd hadoop-release-HDP-3.1.0.0-78-tag
  3. 修改hadoop-project/pom.xml,在文件第1976行开始,修改和添加maven仓库源。

    1. <repositories>
    2. <repository>
    3. <id>dynamodb-local-oregon</id>
    4. <name>DynamoDB Local Release Repository</name>
    5. <!--<url>https://s3-us-west-2.amazonaws.com/dynamodb-local/release</url>-->
    6. <url>https://repo.hortonworks.com/content/repositories/releases</url>
    7. </repository>
    8. <repository>
    9. <id>kunpengmaven</id>
    10. <name>kunpeng maven</name>
    11. <url>https://mirrors.huaweicloud.com/kunpeng/maven</url>
    12. </repository>
    13. <repository>
    14. <id>amazonmaven</id>
    15. <name>amazonmaven</name>
    16. <url>https://repository.mulesoft.org/nexus/content/repositories/public</url>
    17. </repository>
    18. </repositories>

    hadoop移植 - 图4

  4. 修改hadoop-hdfs-project/hadoop-hdfs/pom.xml,在文件底部,添加maven仓库源。

    1. <pluginRepositories>
    2. <pluginRepository>
    3. <id>hortonworkmaven</id>
    4. <name>hortonwork maven</name>
    5. <url>https://repo.hortonworks.com/content/repositories/releases</url>
    6. </pluginRepository>
    7. </pluginRepositories>

    hadoop移植 - 图5

  5. 修改hadoop-common-project/hadoop-common/pom.xml,将两处${env.JAVA_HOME}修改为实际JDK安装路径。

    1. <!--<javahPath>${env.JAVA_HOME}/bin/javah</javahPath>-->
    2. <javahPath>/opt/tools/installed/jdk8u191-b12/bin/javah</javahPath>

    hadoop移植 - 图6
    hadoop移植 - 图7

  6. 执行编译,其中-Dsnappy.lib参数值设为libsnappy.so所在的目录。

mvn package -DskipTests -Pdist,native -Dtar -Dsnappy.lib=/usr/lib64 -Dbundle.snappy -Dmaven.javadoc.skip=true是否缺少fuse_dfs二进制文件。

  • 是,进入步骤7。
  • 否,编译完成,在hadoop-dist/target目录下生成tar.gz包。hadoop移植 - 图8
  1. 进入hadoop-hdfs-project/hadoop-hdfs目录,执行编译。

cd hadoop-hdfs-project/hadoop-hdfs
mvn package -DskipTests -Pnative
**

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

hadoop移植 - 图9须知:
如下操作在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

  1. 请参考《Ambari 2.7.3 部署指南(CentOS 7.6)》配置本地HDP源。
  2. 下载相关工具包,安装rpmrebuild。https://mirrors.huaweicloud.com/kunpeng/archive/kunpeng_solution/bigdata/Tools/tools.zip

下载上面的工具tools.zip压缩包并解压。

  • rebuild.sh —该脚本功能主要负责是负责对rpm包的spec文件的提取和rpm包打包功能
  • checkso工具 —主要是扫描rpm包里面包含哪些so、jar包、bin执行文件
  1. 安装rpmrebuild。
    1. 下载rpmrebuild的安装包。wget https://sourceforge.net/projects/rpmrebuild/files/rpmrebuild/2.12-1/rpmrebuild-2.12-1.noarch.rpm/download -O rpmrebuild-2.12-1.noarch.rpm
    2. 安装rpmrebuild的依赖。
      yum install -y rpm-build.aarch64

    3. 安装rpmrebuild。
      rpm -ivh rpmrebuild-2.12-1.noarch.rpm
  2. 从HDP解压的组件包里拷贝hadoop组件对应的rpm包到指定目录(假设/opt/test/HDP/hadoop)。hadoop移植 - 图10
  3. 进入rebuild.sh脚本所在的目录执行rebuild.sh来对hadoop的rpm包进行spec文件生成。
    ./rebuild.sh rebuild /opt/test/HDP/hadoop
    hadoop移植 - 图11
    hadoop移植 - 图12说明:
    rebuild过程中可能会提示需要安装libtirpc和libtirpc-devel,自行安装即可。
  4. spec文件生成完后会在当前目录下生成workdir目录,workdir/*.rpm/下存放的是各个rpm文件的spec文件。hadoop移植 - 图13

    检查rpm包的so文件、jar包

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

  5. 将上述生成的含有spec文件的rpm文件夹拷贝到某台ARM服务器上的某个目录(例如/opt/HDP/spec/),并将组件的rpm文件拷贝到某个目录下(例如opt/HDP/rpms/)。hadoop移植 - 图15

  6. 利用checkso工具获取对应rpm包的so文件、jar包。
  7. 解压上面获取的checkSo.sh文件。hadoop移植 - 图16
  8. 删除checkSo文件夹中的临时结果文件。rm -rf result/*
    rm -rf temp_unzip_dir/*
    rm -rf tmp_unzip/*
  9. 进入checkso目录,执行脚本检查rpm包是否包含有so的jar包、so、可执行bin文件等。
    ./checkrpm.sh /opt/test/HDP/hadoop
    hadoop移植 - 图17
  10. 执行完以后在result目录下生成对应的检查结果(即:需要替换的bin文件以及jar包等),BinResult.log,DirResult.log,JarResult.log,out.csv为汇总文件。hadoop移植 - 图18

    1. vim BinResult.log:记录需要替换的bin文件,例如libhadoop.a文件hadoop移植 - 图19
    2. vim JarResult.log 记录包含哪些含有so文件的jar包hadoop移植 - 图20
    3. vim out.csv ,该文件主要记录替换jar包所在rpm包里面的路径hadoop移植 - 图21

      制作rpm包

      hadoop移植 - 图22须知:
      如下操作在ARM服务器上执行。
      以下以hadoop_3_1_0_0_78-3.1.1.3.1.0.0-78.x86_64.rpm为例,进行制作rpm包操作。
  11. 对hadoop_3_1_0_0_78-3.1.1.3.1.0.0-78.x86_64.rpm进行解压。
    cd /opt/HDP/spec/hadoop_3_1_0_0_78-3.1.1.3.1.0.0-78.x86_64.rpm
    rpm2cpio /opt/HDP/rpms/hadoop_3_1_0_0_78-3.1.1.3.1.0.0-78.x86_64.rpm | cpio -idv
    hadoop移植 - 图23

  12. 解压后,当前文件夹下会生成usr文件夹。hadoop移植 - 图24
  13. 替换上面利用checkSo扫描出的out.csv中相应路径下的jar,bin等文件为aarch64版本。
    例如替换snappy-java-1.0.5.jar这个jar包,通过out.csv找到此jar包对应的路径usr/hdp/3.1.0.0-78/hadoop/lib,即在刚生成的usr目录下面,找到此jar包替换成编译完成的aarch64版本的snappy-java-1.0.5.jar。
    hadoop移植 - 图25
  14. 创建打包目录(目录/root/rpmbuild/BUILDROOT/是固定的,不可更改)。
    mkdir -p /root/rpmbuild/BUILDROOT/hadoop_3_1_0_0_78-3.1.1.3.1.0.0-78.aarch64/
  15. 拷贝rpm的解压文件(本场景中为usr文件,部分组件解压后包含var,usr两个文件夹)到/root/rpmbuild/BUILDROOT/hadoop_3_1_0_0_78-3.1.1.3.1.0.0-78.aarch64目录下。
    cp -rd usr /root/rpmbuild/BUILDROOT/hadoop_3_1_0_0_78-3.1.1.3.1.0.0-78.aarch64
  16. 打包rpm文件。
    rpmbuild -ba hadoop_3_1_0_0_78.spec
    hadoop移植 - 图26
  17. rpm生成完成后系统会打印rpm包存放路径。hadoop移植 - 图27
    生成的rpm包在/root/rpmbuild/RPMS/aarch64/。
    hadoop移植 - 图28

    六、故障排除

    问题1:运行git clone命令报证书错误

    编译过程中报错:fatal:unable to access ‘https://github.com/ariya/phantomjs.git/‘: Peer’s Certificate issuer is not recognized.
    hadoop移植 - 图29

执行git clone命令前,先执行以下命令。
git config —global http.sslVerify false
**

问题2:wget下载时报无法验证github.com颁发的证书错误

编译过程中报错:无法验证github.com颁发的证书:无法本地检验颁发者的权限。
以不安全的方式连接至github.com,可在wget命令后面跟参数—no-check-certificate。

问题3:hadoop编译下载报错

编译过程中报错:无法验证github.com颁发的证书:无法本地检验颁发者的权限。要以不安全的方式连接至github.com,使用“—no-check-certificate”。
在下载命令后面跟参数—no-check-certificate

编译过程中报错:Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (dist) on project hadoop-kms: An Ant BuildException has occured: java.net.UnknownHostException: archive.apache.org.
hadoop移植 - 图30
在服务器下载apache-tomcat-6.0.44.tar.gz失败,需要用其他方法,例如在windows下载对应文件,并将其拷贝到hadoop-release-HDP-2.3.4.7-tag/hadoop-common-project/hadoop-kms/downloads目录下。

编译过程中报错:Could not resolve dependencies for project org.apache.hadoop:hadoop-auth:jar:2.7.1.2.3.4.7-4:Failed to collect dependencies at org.mortbay.jetty:jetty-util:jar:6.1.26.hwx.
hadoop移植 - 图31
这个问题是由于从远端仓库下载jetty-util-6.1.26.hwx.jar失败,应该是从https://repository.apache.org/content/repositories/snapshorts下载不到对应的jar包。可以去https://repo.spring.io/plugins-release/org/找对应的jar包和pom文件,并放到本地仓库对应的路径下。从报错信息可以看出,jar包的本地路径是~/.m2/repository/org/mortbay/jetty/jetty-util/6.1.26.hwx,对应的远端仓库路径则是:https://repo.spring.io/plugins-release/org/mortbay/jetty/jetty-util/6.1.26.hwx/jetty-util-6.1.26.hwx.jar 。可以看出来,远端仓库的路径和本地仓库路径是一一对应的。后续如果再出现这样的问题,也可以参考这样修改。不过记得要将jar包对应的pom文件也下载下来放到本地仓库。

问题4:制作rpm包报错

编译过程中报错:Unable to build the RPM: Error while executing process. Cannot run program “rpmbuild”.
hadoop移植 - 图32
yum install -y rpm-build

问题5:编译leveldbjni报automake找不到

编译过程中报错:WARNING: ‘automake-1.14’ is missing on your system.
hadoop移植 - 图33
没有安装automake-1.14,可以使用yum install automake安装。如果yum源上找的没有1.14的版本,则需要修改leveldbjni-linux64/target/native-build下的配置文件。修改configure和aclocal.m4,将里面的1.14改成服务器上安装的automake版本,比如1.13.4。

问题6:error: required file ‘autotools/compile’ not found

编译过程中报错:Error: required file ‘autotools/compile’ not found
hadoop移植 - 图34
根据问题信息,需要手动进入相应目录,手动执行相应命令安装。
cd leveldbjni-linux64/target/native-build
automake —add-missing
**

问题7:cmake-compile (cmake-compile) on project hadoop-common: CMake failed with error code

编译过程中报错:cmake-compile (cmake-compile) on project hadoop-common: CMake failed with error code.
hadoop移植 - 图35
升级cmake版本,hadoop编译要求3.12及以上版本:
git clone https://github.com/Kitware/CMake.git
cd CMake
./bootstrap
make -j8
make install
make clean
ln -s /usr/local/bin/cmake /usr/bin/cmake
报错:error An unexpected error occurred: “https://registry.yarnpkg.com/jquery: unable to verify the first certificate
npm config set strict-ssl false