liusheng / liusheng.github.io

Liusheng's blog
http://liusheng.github.io
5 stars 1 forks source link

Hadoop 2.7.7在openEuler ARM平台上适配总结 #32

Open liusheng opened 3 years ago

liusheng commented 3 years ago

1. leveldbjni 适配的问题

在openEuler ARM服务器上尝试编译Hadoop 2.7.7版本的时候,我们遇到了依赖包leveldbjni缺少ARM平台适配的问题,具体错误信息:

cannot open shared object file: No such file or directory (Possible cause: can't load AMD 64-bit .so on a AARCH64-bit platform)]

该问题,我们曾经在做Hadoop Trunk分支的ARM平台适配的时候也遇到过,具体可以见 JIRA Issue, 由于leveldbjni依赖包本身缺少对ARM平台的支持,我们曾推动完成了其对于ARM平台的适配,但是由于leveldbjni代码仓库已经处于维护状态,近3年来都没有任何代码合入,所以很难推动leveldbjni本身去支持ARM平台。

因此,我们在Maven中心仓库建立了org.openlabtesting.leveldbjni的仓库,将我们完成ARM适配的leveldbjni编译包放到该Maven 仓库,并在Hadoop的pom.xml中修改适配,使用了Maven的profile机制,实现编译的时候自动检测硬件平台是否为ARM架构,如果是则使用适配后的leveldbjni包,如下:

    <profile>
      <id>aarch64</id>
      <properties>
        <leveldbjni.group>org.openlabtesting.leveldbjni</leveldbjni.group>
      </properties>
      <activation>
        <os>
          <family>linux</family>
          <arch>aarch64</arch>
        </os>
      </activation>
    </profile>

基于此,在Hadoop 2.7.7 openEuler+ARM平台适配的时候,我们也做了类似的修改,见[PR]。(https://github.com/kunpengcompute/hadoop/pull/7)

2. Hadoop 依赖包protobuf-2.5.0 适配问题

Protocol buffer是Hadoop集群中服务间RPC流程的实现基础,也是Hadoop编译执行的必选依赖包,在我们尝试编译运行Hadoop 2.7.7版本到openEuler+ARM平台的过程中,也遇到了protobuf适配ARM平台的问题。

同样地,我们也曾在Hadoop Trunk 分支适配ARM平台的工作中遇到过这个问题,Hadoop Trunk分支所依赖的protobuf 2.5.0版本不支持ARM平台,但是在protobuf较新的3.7.x版本里已经支持了ARM平台,因此我们在Hadoop社区推动了protobuf依赖包的版本升级以适配ARM平台。当然,在Hadoop Trunk分支中升级 Protobuf版本,不仅仅是依赖包版本的升级,也做了很多代码层面的适配,具体见JIRA Issue

在实现Hadoop 2.7.7版本 openEuler+ARM平台版本适配的问题的时候,我们没有将protobuf版本升级,而是通过对protobuf-2.5.0版本的源码包打Patch,然后编译的方式来完成适配的。

3. 增加Hadoop 2.7.7 ARM平台Dockerfile

在Hadoop的代码的dev-support目录中提供了一些Hadoop社区CI依赖的脚本和工具,同时也为开发者提供了一些开发环境相关的工具,其中包含了Hadoop编译构建的Dockerfile,可以用来一键式地快速部署一个开发环境。在我们之前推动完成Hadoop Trunk分支的ARM平台适配的时候,也增加了ARM平台的Dockerfile。

对于Hadoop 2.7.7版本+openEuler ARM平台适配来说,添加一个对应的Dockerfile,也非常重要,对于想深入了解的人来说,提供了一个快速入门和验证的方式,具体参见 PR