最近尝试搭建伪分布式hadoop环境,遇到了一些有关hadoop本地库的问题,在此做一个整理,近针对hadoop2.6.0,ubuntu系统。
遇到问题:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
1.什么是hadoop本地库(Native Library)?
鉴于性能问题以及某些Java类库的缺失,对于某些组件,Hadoop提供了自己的本地实现。这些组件保存在Hadoop的一个独立的动态链接的库里。这个库在*nix平台上叫libhadoop.so.
2.hadoop2.6.0本地库包含组件:
a.压缩编码解码器(bzip2, lz4, snappy, zlib)
b.Native IO utilities for HDFS Short-Circuit Local Reads and Centralized Cache Management in HDFS
c.CRC32校验实施。
备注:循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。
3.支持平台:RHEL4/Fedora,Ubuntu,Gentoo
4.本地库的使用:
a.检查组件;
b.检查支持的平台;
c.无论是下载的hadoop发行版本(已经包含预构建的hadoop本地库),还是自己构建hadoop本地库,本地库的名字都是一样的:libhadoop.so。
d.安装compression codec development packages (>zlib-1.2, >gzip-1.2):如果是下载好的本地库,安装一个或多个在部署你想用到的compression codec开发包;如果是构建本地库,则必须安装所有的开发包。
e.检查运行日志文件。
5.构建本地库:
hadoop本地库是使用 ANSI C写的,使用GNU autotools-chain构建的,这就意味着应该在任意平台上使用标准的C编译器和GNU autotools-chain直接构建它。构建前需要在平台上安装以下包:
1)C compiler (e.g. GNU C Compiler)
2)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
参考资料:http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/NativeLibraries.html
备注:
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编译成跟自己系统版本相符的版本