Mac OSX 编译hadoop本地库
当正常启动hadoop的时候,会出现下面的错误:
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
表示本地下载hadoop文件没有本地hadoop库,在Macos平台即
libhadoop.dylib
和
libhdfs.dylib
和
libnativetask.dylib
,编译好即可在
$HADOOP_HOME/lib/native
下看到 ,这样在启动hadoop时就没有上面的错误。
当其他库编译需要使用时添加到你的
LD_LIBRARY_PATH
和
Mac OSX
专属的
DYLD_LIBRARY_PATH
中即可。
下面详细记录Hadoop源码编译过程。
一. 环境准备
- Mac版本信息:Catalina 10.15.3(当前最新)
2. 编译的hadoop:3.1.0 。先下载好对应版本的hadoop二进制包,后面把编译出的本地库进行覆盖。
没有使用最新的3.2.1,是因为
openssl
依赖编译问题没有解决,设置好环境参数仍然找不到。
3. JDK版本:1.8
JDK和Hadoop环境变量设置:
export JAVA_HOME="/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home"
export HADOOP_HOME=$HOME/hadoop-3.1.0
export PATH="$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin"
4. 需要homebrew安装一些编译所需的依赖:
- gcc
在Mac OSX还是用的clang编译
export CC=clang
export CXX=clang++
- GNU Autools Chain: autoconf, automake, libtool
- cmake
- snappy(压缩)
我的
snappy
版本是1.1.8,在打包编译的时候由于代码是c++11标准,但是hadoop本身编译不支持C++11,应该也是个bug,所以我先在环境变量排除了,编译好再link回来。
相关issue:
brew unlink snappy
- gzip(压缩)
- bzip2(压缩)
- protobuf (必须使用2.5.0版本,brew源没有需要在github下载源码编译)
cd /Downloads/protobuf-2.5.0
# 这样配置方便brew link
./configure --prefix=/usr/local/Cellar/protobuf/2.5.0
# 这样就会安装到面配置的目录
make install
# 添加到环境变量
brew link protobuf@2.5.0
如果不用
brew
,也可以直接添加到你的
.zshrc
或
.bashrc
中
export PROTOBUF=/usr/local/Cellar/protobuf
export PATH="$PATH:$PROTOBUF/bin"
- zlib(压缩)
- openssl
需要配置环境变量到
.zshrc
export OPENSSL_ROOT_DIR="/usr/local/opt/openssl@1.1"
export OPENSSL_INCLUDE_DIR="$OPENSSL_ROOT_DIR/include"
export LDFLAGS="-L${OPENSSL_ROOT_DIR}/lib"
export CPPFLAGS="-I${OPENSSL_ROOT_DIR}/include"
export PKG_CONFIG_PATH="${OPENSSL_ROOT_DIR}/lib/pkgconfig"
当然brew也支持同时安装多个包:
brew install gcc autoconf automake libtool cmake snappy gzip bzip2 zlib openssl
这样系统环境就配置好了,编译前需要下载java项目打包工具
maven
brew install maven
(最好在setting.xml下配置好国内镜像)
➜ ~ mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/Cellar/maven/3.6.3_1/libexec
Java version: 1.8.0_232, vendor: AdoptOpenJDK, runtime: /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.15.3", arch: "x86_64", family: "mac"
二. 编译Hadoop
下载hadoop src包,此处可以直接下载source,也可以直接从github克隆源码
git clone https://github.com/apache/hadoop.git
cd hadoop
git checkout branch-2.7.2
mvn package -Pdist,native -DskipTests -Dtar
如果maven打包出错失败,找到错误解决后从失败的地方(包)继续编译,比如:
mvn clean package -Dmaven.javadoc.skip=true -Pdist,native -DskipTests -Dtar -rf :hadoop-mapreduce-client-nativetask
打包时间估计有半个小时,(需设置国内镜像,或科学上网)
三. 拷贝本地库
cp -R hadoop-dist/target/hadoop-3.1.0/lib $HADOOP_HOME/
四、检查
hadoop checknative -a
我运行的结果:
➜ ~ hadoop checknative -a
2020-03-10 23:44:27,492 WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version
2020-03-10 23:44:27,497 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
2020-03-10 23:44:27,514 ERROR snappy.SnappyCompressor: failed to load SnappyCompressor
java.lang.UnsatisfiedLinkError: Cannot load libsnappy.1.dylib (dlopen(libsnappy.1.dylib, 9): image not found)!
at org.apache.hadoop.io.compress.snappy.SnappyCompressor.initIDs(Native Method)
at org.apache.hadoop.io.compress.snappy.SnappyCompressor.<clinit>(SnappyCompressor.java:57)
at org.apache.hadoop.io.compress.SnappyCodec.isNativeCodeLoaded(SnappyCodec.java:82)
at org.apache.hadoop.util.NativeLibraryChecker.main(NativeLibraryChecker.java:100)
2020-03-10 23:44:27,517 WARN erasurecode.ErasureCodeNative: ISA-L support is not available in your platform... using builtin-java codec where applicable
Native library checking:
hadoop: true /Users/esmee/hadoop-3.1.0/lib/native/libhadoop.dylib
zlib: true /usr/lib/libz.1.dylib
zstd : true /usr/local/Cellar/zstd/1.4.4/lib/libzstd.1.4.4.dylib