问题导读1.hadoop本地库支持哪些平台?2.本地库是否有32,64之分?3.hadoop通过什么工具来检测本地库是否加载正确?4.如何加载本地库?包含哪些步骤?5.本地库在什么情况下不需要使用DistibutedCache?
概述这个指南描述了hadoop本地库,包括关于共享本地库的小讨论。注意:取决于你的环境,这个词 “native libraries”涉及所有的*.so’,你需要编译;这个词 “native compression”涉及所有的*.so’的你需要编译指定与压缩相关的。当前,尽管如此,这个文档仅限于hadoop本地库 (libhadoop.so).文档为libhdfs库(libhdfs.so)点这here.hadoop本地库处于性能考虑和非可用性 Java 实现,Hadoop的具有某些部件的本地实现,这些组件单独是可用的。动态链接库调用本地原生Hadoop库。 在 *nix(如:Linux,unix) 平台上本地库名字为 libhadoop.so.用法相当容易使用hadoop本地库:1.查看组件2.查看支持平台3.下载一个构建好的hadoop发布版本或则自己构建本地库。无论是自己下载还是自己构建(编译),本地的名字是相同的: libhadoop.so4.安装压缩编解码开发包(> > zlib-1.2,gzip-1.2):如果你下载本地库,安装一个或则多个开发包,无论压缩编解码你想用于部署。如果你想编译本地库,它是强制性安装了开发包。5.检查运行时日志文件组件本地库包含各种组件:Compression Codecs (bzip2, lz4, snappy, zlib)
Native IO utilities for HDFS Short-Circuit Local Reads and Centralized Cache Management in HDFS
CRC32 校验实现支持平台hadoop本地库仅支持在*nix平台上,不支持 Cygwin和Mac OS X 平台.hadoop本地库主要用在GNU/Linus平台,已测试RHEL4/Fedora
Ubuntu
Gentoo上面hadoop 32/64位本地库与相应的32/64 位 jvm工作下载hadoop预构建 32-位 i386-Linux本地库作为hadoop分布式一部分是有效的,位于e lib/native目录。你可以下载从hadoop Common Releases.一定要安装zlib和/或gzip 开发包构建hadoop本地库是用ANSI C编写,并使用GNU自动工具链 (autoconf, autoheader, automake, autoscan, libtool)构建。这意味着他可以直接使用工具链 (autoconf, autoheader, automake, autoscan, libtool)在任何平台上构建(查看支持平台)在平台上包需要安装: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文件,通过本地库标识构建hadoop本地库
[Bash shell] 纯文本查看
1$ mvn package -Pdist,native -DskipTests -Dtar你可以查看新构建的库在
[Bash shell] 纯文本查看
1$ hadoop-dist/target/hadoop-2.7.1/lib/native请注意以下几点:1.它强制安装 zlib 和 gzip 开发包在目标平台,构建hadoop本地库。尽管如此,如果你想安装部署使用一个codec包,也是足够的。2.为了构建和部署hadoop本地库,使用正确的zlib 32/64位 库是需要的 ,在目标平台上依赖32/64 位 jvm,运行时bin/hadoop脚本确保hadoop本地库通过系统属性-Djava.library.path=在库路径。在运行时,检查hadoop MapReduce任务日志文件1.如果所有的事情准备好,然后调试util.NativeCodeLoader ,尝试加载自定义构建本地库。。。 INFO util.NativeCodeLoader - Loaded the native-hadoop library
2.如果产生错误,然后:INFO util.NativeCodeLoader - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable检查NativeLibraryChecker是一个工具用来检测本地库是否加载正确,你可以启动nativelibrarychecker如下:
[Bash shell] 纯文本查看
1
2
3
4
5
6
7
8
9$ hadoop checknative -a
14/12/06 01:30:45 WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version
14/12/06 01:30:45 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop: true /home/ozawa/hadoop/lib/native/libhadoop.so.1.0.0
zlib: true /lib/x86_64-linux-gnu/libz.so.1
snappy: true /usr/lib/libsnappy.so.1
lz4: true revision:99
bzip2: false本地共享库你可以加载任何本地共享库使用DistributedCache,分发和符号链接库文件这个例子展示了如何分发共享本地库mylib.so,和从mapreduc任务加载的。1.首先复制库到hdfs:bin/hadoop fs -copyFromLocal mylib.so.1 /libraries/mylib.so.12.job启动程序应该包含下面:
[Bash shell] 纯文本查看
1
2DistributedCache.createSymlink(conf);
DistributedCache.addCacheFile("hdfs://host:port/libraries/mylib.so. 1#mylib.so", conf);3.MapReduce 任务应该包含:
[Bash shell] 纯文本查看
1System.loadLibrary("mylib.so");注意:如果你下载或则构建了hadoop本地库,不需要使用DistibutedCache使库提供给mapreduce任务版本:2.7.1