1、hadoop本地库
32位的i386-Linux的hadoop本地库位于lib/native目录中。
hadoop本地库包含三个组件(后两个完全不知所云,不过以后可能会学习到):
1、压缩与解压(bzip2,lz4,snappy,zlib)。
2、用于支持 HDFS Short-Circuit Local Reads和Centralized Cache Management in HDFS的IO工具。
3、CRC32 checksum的实现。
hadoop本地库由C语言编写,由GNU自动编译工具(autoconf,autoheader,automake,autoscan,libtool)进行编译。
编译时需要安装的工具包括:
C编译器(例如GNU C编译器)
GNU自动编译工具:autoconf,automake,libtool
zlib开发包(稳定版本 >=1.2.0)
openssl开发包(例如libssl-dev)
注意:zlib的位数需要和部署环境的JVM位数(32/64)一致。
hadoop通过系统参数-Djava.library.path=<path>来指定本地库的位置。
运行mapreduce任务时若出现异常,则会打印下面的日志
INFO util.NativeCodeLoader - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
NativeLibraryChecker可以用来检查本地库是否可以正确地被加载(在笔记03中有讲到):
[hadoop@localhost hadoop-2.7.2]$ bin/hadoop checknative -a
17/05/12 14:53:10 WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version
17/05/12 14:53:10 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop: true /home/hadoop/hadoop-env/hadoop-2.7.2/lib/native/libhadoop.so.1.0.0
zlib: true /lib64/libz.so.1
snappy: true /lib64/libsnappy.so.1
lz4: true revision:99
bzip2: false
openssl: false Cannot load libcrypto.so (libcrypto.so: cannot open shared object file: No such file or directory)!
17/05/12 14:53:11 INFO util.ExitUtil: Exiting with status 1
可以看到有的库加载成功了,有的失败了。
2、本地共享库
使用DistributedCache可以散布和链接任何的本地共享库。方法是:
1、将库文件拷贝到HDFS:
bin/hadoop fs -copyFromLocal mylib.so.1 /libraries/mylib.so.1
2、作业启动程序需要包含下面的代码
DistributedCache.createSymlink(conf); DistributedCache.addCacheFile("hdfs://host:port/libraries/mylib.so. 1#mylib.so", conf);
3、接着MapReduce操作就可以包含:
System.loadLibrary("mylib.so");