#hadoop checknative -a
2019-04-15 04:17:26,229 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
2019-04-15 04:17:26,233 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
2019-04-15 04:17:26,251 WARN zstd.ZStandardCompressor: Error loading zstandard native libraries: java.lang.InternalError: Cannot load libzstd.so.1 (libzstd.so.1: cannot open shared object file: No such file or directory)!
2019-04-15 04:17:26,255 WARN erasurecode.ErasureCodeNative: ISA-L support is not available in your platform... using builtin-java codec where applicable
Native library checking:
hadoop: true /opt/software/hadoop-3.2.0/lib/native/libhadoop.so.1.0.0
zlib: true /lib64/libz.so.1
zstd : false
snappy: true /lib64/libsnappy.so.1
lz4: true revision:10301
bzip2: true /lib64/libbz2.so.1
openssl: false Cannot load libcrypto.so (libcrypto.so: cannot open shared object file: No such file or directory)!
ISA-L: false libhadoop was built without ISA-L support
2019-04-15 04:17:26,435 INFO util.ExitUtil: Exiting with status 1: ExitException
发现少了,zstd 和openssl
1.什么是hadoop本地库(Native Library)?
鉴于性能问题以及某些Java类库的缺失,对于某些组件,Hadoop提供了自己的本地实现。这些组件保存在Hadoop的一个独立的动态链接的库里。这个库在*nix平台上叫libhadoop.so.
2.hadoop2.6.0本地库包含组件:
- 压缩编码解码器(bzip2, lz4, snappy, zlib)
- Native IO utilities for HDFS Short-Circuit Local Reads and
Centralized Cache Management in HDFS - CRC32校验实施。
3.支持平台:RHEL4/Fedora,Ubuntu,Gentoo
4.本地库的使用:
- 检查组件;
- 检查支持的平台;
- 无论是下载的hadoop发行版本(已经包含预构建的hadoop本地库),还是自己构建hadoop本地库,本地库的名字都是一样的:libhadoop.so。
- 安装compression codec development packages (>zlib-1.2,
gzip-1.2):如果是下载好的本地库,安装一个或多个在部署你想用到的compression codec开发包;如果是构建本地库,则必须安装所有的开发包。 - 检查运行日志文件。
5.构建本地库:
hadoop本地库是使用 ANSI C写的,使用GNU autotools-chain构建的,这就意味着应该在任意平台上使用标准的C编译器和GNU autotools-chain直接构建它。构建前需要在平台上安装以下包:
- C compiler (e.g. GNU C Compiler)
- GNU Autools Chain: autoconf, automake, libtool zlib-development
package (stable version >= 1.2.0) openssl-development package(e.g.
libssl-dev)
一旦安装好所需的包,使用标准的hadoop pom.xml文件,并传递本地标志来构建本地库:
$ mvn package -Pdist,native -DskipTests -Dtar
备注:
1.使用hadoop预构建的本地库,并安装zlib1g, gzip,扔出现相同的问题。
开启debug:export HADOOP_ROOT_LOGGER=DEBUG,console
报错:16/05/31 20:14:09 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: /home/hadoop/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0: /home/hadoop/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0: wrong ELF class: ELFCLASS64 (Possible cause: architecture word width mismatch)
分析:可能是libhadoop.so.1.0.0与系统位数不一致。
查看libhadoop.so.1.0.0文件信息:file lib/native/libhadoop.so.1.0.0
lib/native/libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=3a80422c78d708c9a1666c1a8edd23676ed77dbb, not stripped——————>libhadoop.so.1.0.0文件居然是64位的(不是说默认的是32位的吗),我的系统是ubuntu32位的。
解决方法:
方法一:从网上下载了一个网友编译好的本地库,将原来的本地库替换掉,再重新启动hadoop,警告消除。
方法二:将native library编译成跟自己系统版本相符的版本