执行命令hadoop/sbin/start-dfs.sh失败,报错信息如下:
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Incorrect configuration: namenode address dfs.namenode.servicerpc-address or dfs.namenode.rpc-address is not configured.
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
查找原因:
1、查看更详细的debug信息
执行命令export HADOOP_ROOT_LOGGER=DEBUG,console,然后再执行命令hadoop/sbin/start-dfs.sh,发现version `GLIBC_2.14' not found:
Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: /usr/local/hadoop/lib/native/libhadoop.so.1.0.0: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /usr/local/hadoop/lib/native/libhadoop.so.1.0.0)
好了,现在发现问题了,是查找GLIBC_2.14这个东西找不到,那么接下来就来了解一下这是个什么东西,怎样才能让hadoop找到这个东西。
2、GLIBC是什么
glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现…
3、/lib64/libc.so.6是什么
libc.so.6 是c运行时库 glibc的软链接,而系统几乎所有程序都依赖c运行时库。程序启动和运行时,是根据libc.so.6 软链接找到glibc库。每个glibc.so文件有它支持的libc版本,可以通过 strings /lib64/libc.so.6 |grep GLIBC查看,一定要选择这条命令列出的版本。如果程序编译的时候链接的libc库版本不在程序运行环境下的glibc库支持的libc版本之内,也会报错。于是,系统的所有命令 ls,cp,cd 等等都无法使用了。
4、查看系统的GLIBC版本
执行命令strings /lib64/libc.so.6 |grep GLIBC
发现支持的最大版本是GLIBC_2.12,而hadoop错误信息里提到需要GLIBC_2.14
好了,现在我们就想办法来添加GLIBC_2.14或更高版本,现在要考虑升级到哪个版本呢?
查资料发现:对于CentOS这样的系统,为了追求稳定性往往各种库版本都很低,比如6.5(我的机器系统版本)自带的还是glibc2.12, 而ubuntu 14.04带glibc2.19,如果升级基本C运行库到一个太新的版本,可能会影响CentOS的运行。所以我选择升级一个刚好够用的版本GLIBC_2.14,能解决问题就好,不找麻烦,嘻嘻。
现在就来解决实际的问题:
搭配这里找需要的版本http://ftp.gnu.org/gnu/glibc/
5、下载GLIBC_2.14包
wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
6、解压GLIBC_2.14包
tar -zxf glibc-2.14.tar.gz
7、编译
cd glibc-2.14,建立临时目录 mkdir build
cd build
执行../configure --prefix=/usr/local/glibc-2.14指定安装目录为/usr/local/glibc-2.14
执行make && make install安装
cp /usr/local/glibc-2.14/lib/libc-2.14.so /lib64/ ,也就是把
编译好的so复制到/lib64下面
8、安装
重建软件,这一步最重要,操作不当,系统会直接无法使用
cd /lib64
删除旧的文件LD_PRELOAD=/lib64/libc-2.12.so rm libc.so.6
更新为新的文件 LD_PRELOAD=/lib64/libc-2.14.so ln -s /lib64/libc-2.14.so libc.so.6
注:libc.so.6只是一个软连,删除后可能会导致ls等命令都无法正常使用。这时不要慌张,可以通过LD_PRELOAD环境变量来解决。
9、查看更新成功
strings /lib64/libc.so.6 |grep GLIBC
10、再次执行./sbin/start-dfs.sh没有报错信息了
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。