***********************************************************************************************
Hadoop本地库
Hadoop是使用Java语言开发的,但是有一些需求和操作并不适合使用java,所以就引入了本地库(NativeLibraries)的概念,通过本地库,Hadoop可以更加高效地执行某一些操作。
Hadoop本地库在hadoop文件夹下lib/native中,内容如下:
其中的libhadoop.so就是had oop的本地库。如果本地库不存在或者和当前操作系统版本不一致时,就会出现上面的报错。
***********************************************************************************************
错误定位
下面的测试方法来自于:http://www.linuxidc.com/Linux/2012-04/59200.htm。运行两个命令,如下:
截取主要的错误信息如下:
Failed to load native-hadoop with error:java.lang.UnsatisfiedLinkError:/home/chenhuan/hadoop-2.2.0/lib/native/libhadoop.so.1.0.0:/lib/tls/i686/cmov/libc.so.6: version`GLIBC_2.12' not found (required by/home/chenhuan/hadoop-2.2.0/lib/native/libhadoop.so.1.0.0)
-------------------------------------------------------------------
关键在于这句:/lib/tls/i686/cmov/libc.so.6:version 'GLIBC_2.12'notfound
看样子确实是因为libc的版本不对,需要的版本应该是2.12。可以使用下面的命令来查看libc的版本:
这里实际的版本是2.11.1。
------------------------------------------------------------------
所以解决问题的办法是将系统的libc版本升级到2.12.1。
***********************************************************************************************
升级libc
从下面的地址下载两个文件:http://ftp.gnu.org/gnu/glibc/
(1)glibc-2.12.1.tar.gz
(2)glibc-linuxthreads-2.5.tar.bz2
=======================================================================

安装libc-2.12.1
-----------------------------------------------------------
(1)建立一个文件夹,将glibc-2.12.1.tar.gz解压入其中;
-----------------------------------------------------------
(2)将glibc-linuxthreads-2.5.tar.bz2解压到glibc-2.9中:
-----------------------------------------------------------
(3)configure
注意,这里需要退出glibc-2.12.1文件夹,在外层文件夹调用configure命令。下面的两个命令非常重要,直接决定是否可以成功:
$export CFLAGS="-O2 -U_FORTIFY_SOURCE-fno-stack-protector"
$./glibc-2.12.1/configure --prefix=/usr --disable-profile--enable-add-ons --with-headers=/usr/include--with-binutils=/usr/bin
----------------------------------------------------------
(4)make
直接在外层文件夹调用make就可以了,如果上面的CFLAGS设置不对,这里会出现如下的一个error:
../misc/syslog.c:In function ‘__vsyslog_chk’:
../misc/syslog.c:123: sorry, unimplemented: inlining failed in callto ‘syslog’: function body not available
../misc/syslog.c:155: sorry, unimplemented: called from here
make[2]: *** [/mnt/adm/sources/glibc-build/misc/syslog.o] Error1
make[2]: Leaving directory `/mnt/adm/sources/glibc-src/misc'
make[1]: *** [misc/subdir_lib] Error 2
make[1]: Leaving directory `/mnt/adm/sources/glibc-src'
make: *** [all] Error 2 #make install
更加详细的内容可以参考这篇文章:http://swiss.ubuntuforums.org/showthread.php?p=7624127
---------------------------------------------------------
(5)sudo make install
如果make没有问题,这里一般不会出现问题,至此安装完成。
*********************************************************************************************
现在可以再来查看libc的版本,如下:
但是在/lib/tls/i686/cmov/libc.so.6中的结果还是libc.2.12.1.so
既然libc-2.12.1.so已经存在了,再创建一个libc.so.6的符号链接就可以了~~~
PS:折腾了一下午终于搞定了,明天开始做答辩PPT~~~