macOS m1 m2 芯片编译 Hadoop native 库, 消除警告信息

默认情况下,直接运行 Hadoop 命令会出现如下警告:

1
2
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...
using builtin-java classes where applicable

当然这个警告信息没有什么实质的影响,一般也不会在本地电脑运行计算任务,消除警告只是强迫症发作罢了。
这里提供了编译好的二进制文件,但是版本不全,需要手动编译的参考下面的内容。
另有 Intel CPU 版本的二进制文件。我上面仓库中编译的 ARM 版本也 merge 到此仓库了。
只需要将对应版本 hadoop-x.x.x/lib/native 下的文件,替换到本地 ${HADOOP_HOME}/lib/native 中即可,不需要重启集群。

另外还有一个更简单的办法,修改日志等级,就不会打印这条警告日志了,只需要在 ${HADOOP_HOME}/etc/hadoop/log4j.properties 里面加上下面这一行即可:

1
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR

下面的教程仅针对 Apple silicon (M1 / M2) 芯片。

安装 PB 2.5.0

Hadoop 2.x 需要先编译安装 PB 2.5.0,Hadoop 3.x 不需要:

准备源码

1
2
3
wget https://github.com/google/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.bz2
tar -xvjf protobuf-2.5.0.tar.bz2
cd protobuf-2.5.0/

修改 src/google/protobuf/stubs/platform_macros.h,增加如下开始的三行(PB 2.5.0 版本代码的第 60 行开始):

1
2
3
4
5
6
#elif defined(__arm64__)
#define GOOGLE_PROTOBUF_ARCH_ARM 1
#define GOOGLE_PROTOBUF_ARCH_64_BIT 1
#else
#error Host architecture was not detected as supported by protobuf
#endif

编译安装

1
2
3
4
5
6
7
8
9
10
# brew install m4
export M4=$(brew --prefix)/Cellar/m4/1.4.19/bin/m4
./autogen.sh
./configure
make -j8 && make check
sudo make install

export PATH="/usr/local/bin:$PATH"
protoc --version
# libprotoc 2.5.0

至此 PB 2.5.0 安装完成。

编译 Hadoop

准备源码

1
2
3
4
5
git clone https://github.com/apache/hadoop.git
cd hadoop/
git checkout branch-2.10.0
export SDKROOT=$(xcrun --sdk macosx --show-sdk-path)
export LIBRARY_PATH="$SDKROOT/usr/lib"

hadoop-common-project/hadoop-common/pom.xml 文件的 cmake 参数里添加如下字段:

1
<ZLIB_LIBRARY>/opt/homebrew/Cellar/zlib/1.2.12/lib</ZLIB_LIBRARY>

修改文件:

1
2
3
vim hadoop-common-project/hadoop-common/src/main/native/src/exception.c
# 删除下面代码
|| defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 32)

修改文件:

1
2
3
vim hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.c
# 在头部添加一行
#include <sys/ioctl.h>

开始编译

编译过程中请保持网络畅通

1
2
3
4
5
6
7
8
9
mvn clean package -Pnative -DskipTests
# hadoop 3.x 用下面这个命令编译
# mvn clean package -Pnative -DskipTests -Dos.arch=x86_64

cp hadoop-common-project/hadoop-common/target/native/target/usr/local/lib/* $HADOOP_HOME/lib/native/
cp hadoop-hdfs-project/hadoop-hdfs-native-client/target/native/target/usr/local/lib/* $HADOOP_HOME/lib/native/

sudo ln -s $(brew --prefix)/Cellar/snappy/1.1.9/lib/libsnappy.1.dylib $JAVA_HOME/bin/
sudo ln -s $(brew --prefix)/Cellar/zstd/1.5.2/lib/libzstd.1.dylib $JAVA_HOME/bin/

检查编译、安装结果:

1
2
3
4
5
6
7
8
9
10
11
hadoop checknative -a

# 主要结果
Native library checking:
hadoop: true /opt/hadoop-2.10.0/lib/native/libhadoop.dylib
zlib: false
snappy: true /opt/homebrew/Cellar/snappy/1.1.9/lib/libsnappy.1.1.9.dylib
zstd : true /opt/homebrew/Cellar/zstd/1.5.2/lib/libzstd.1.5.2.dylib
lz4: true revision:10301
bzip2: false
openssl: false build does not support openssl.