1. 背景

社区提供的 Hadoop 安装包中并不包含 native 库,比如常用的压缩算法 zstd、snappy 等。

最近在本地调试数据入湖程序,想使用压缩和解压效率更高的 zstd 或者 snappy 替换默认的 gzip 压缩,所以这里想尝试在 macOS 平台重新编译 Hadoop 2.9.2 。

2. 查看本地类库

1
hadoop checknative -a 

因原生 Hadoop 类库支持系统有限,所以执行该命令以后会有本地类库无法加载的告警,具体信息如下

img.png

3. 编译

3.1. 准备编译环境

  • Java 环境(已安装,不做赘述,没安装的可以通过 HomeBrew 安装)
  • Maven(已安装,不做赘述,我这里的版本是 3.6.0)

安装完成后需要配置上述软件的环境变量信息

img.png

3.2. 安装依赖库

  • 安装基础类库

img.png

1
brew install gcc cmake autoconf automake libtool
  • 安装 gzip、zlib、gzip2 、zstd 等压缩库
1
2
brew install gzip bzip2 zlib
brew install zstd
  • 安装 openssl 依赖
1
brew install openssl
  • 安装 protobuf

不安装的话会编译失败,报错找不到 protoc

img.png

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11

## 版本必须和Hadoop源码中版本保持一致
grep 'protobuf.version' */pom.xml
sudo wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz
sudo chown beibei:admin protobuf-2.5.0.tar.gz
sudo tar -zxvf protobuf-2.5.0.tar.gz
sudo chown -R beibei:admin protobuf-2.5.0/
cd protobuf-2.5.0/
./configure
make && make install
protoc --version #libprotoc 2.5.0

平台的问题,安装过程中可能会报错,例如

img.png

这里可以参考:https://github.com/protocolbuffers/protobuf/issues/8836 解决,亲测有效

platform_macros.h

1
2
3
#elif defined(__arm64__)
#define GOOGLE_PROTOBUF_ARCH_ARM 1
#define GOOGLE_PROTOBUF_ARCH_64_BIT 1

可以执行以下命令即代表安装成功

img.png

3.3. 编译 Hadoop 源码

在 Hadoop 源码根目录执行

1
mvn package -DskipTests -Pdist,native -Dtar

img.png

期望的结果是经过漫长编译后,全部 BUILD SUCCESS,然后将编译出的 native library 库(路径hadoop-2.9.2-src/hadoop-dist/target/hadoop-2.9.2/lib/native)替换到之前安装的 Hadoop 的库目录中(路径hadoop-2.9.2/lib/native)。

而实际经历了几个小时,在 Mac 编译总会卡死在 cmake 无法成功,debug 也没找到明确的报错提示,尝试了几种从网上找的解决办法,都无济于事。这里先贴一下报错记录一下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  13.684 s
[INFO] Finished at: 2024-01-10T13:51:21+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.hadoop:hadoop-maven-plugins:2.9.2:cmake-compile (cmake-compile) on project hadoop-common: CMake failed with error code 1 -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <goals> -rf :hadoop-common

呃,太坑了,编译之路太坎坷了,等我继续探索探索 😭😭😭

4. 参考资料

https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-common/NativeLibraries.html https://github.com/protocolbuffers/protobuf/issues/8836