提问者:小点点

Hadoop“无法为您的平台加载本地Hadoop库”警告


我目前正在运行CentOS的服务器上配置hadoop。运行start-dfs.shstop-dfs.sh时,会出现以下错误:

警告util.NativEcodeLoader:无法为您的平台加载native-hadoop库。。。使用Builtin-Java类(如适用)

我运行的是Hadoop2.2.0。

在网上搜索会出现以下链接:http://balanceandbreath.blogspot.ca/2013/01/utilnativeCodeLoader-cannable-to-load.html

但是,Hadoop2.x上/native/目录的内容似乎不同,所以我不确定该怎么做。

我还在hadoop-env.sh中添加了这两个环境变量:

导出hadoop_opts=“$hadoop_opts-djava.library.path=/usr/local/hadoop/lib/”

导出hadoop_common_lib_native_dir=“/usr/local/hadoop/lib/native/”

有什么想法吗?


共3个答案

匿名用户

我假设您正在64位CentOS上运行Hadoop。您看到警告的原因是本机Hadoop库$hadoop_home/lib/native/libhadoop.so.1.0.0实际上是在32位上编译的。

总之,这只是一个警告,不会影响Hadoop的功能。

如果您确实想消除此警告,请下载Hadoop的源代码并在64位系统上重新编译libhadoop.so.1.0.0,然后替换32位系统。

关于如何重新编译源代码的步骤包含在这里为Ubuntu:

  • http://www.ercoppa.org/linux-compile-hadoop-220-fix-cannable-to-load-native-hadoop-library.htm

祝你好运。

匿名用户

只需将word native添加到hadoop_opts中,如下所示:

export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native"

PS:谢谢Searene

匿名用户

答案取决于。。。我刚刚从tarball在64位CentOS 6.6上安装了Hadoop2.6。Hadoop安装确实附带了一个预构建的64位原生库。对于我的安装,这里是:

/opt/hadoop/lib/native/libhadoop.so.1.0.0

我知道它是64位的:

[hadoop@VMWHADTEST01 native]$ ldd libhadoop.so.1.0.0
./libhadoop.so.1.0.0: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./libhadoop.so.1.0.0)
linux-vdso.so.1 =>  (0x00007fff43510000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f9be553a000)
libc.so.6 => /lib64/libc.so.6 (0x00007f9be51a5000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9be5966000)

不幸的是,我愚蠢地忽略了这个问题的答案,因为我正在关注这个问题,“这个库是32 pr 64位的吗?”

`GLIBC_2.14' not found (required by ./libhadoop.so.1.0.0)

所以,吸取教训。不管怎样,剩下的至少让我能够压制警告。因此,我继续并执行了其他答案中建议的所有操作,使用HADOOP_OPTS环境变量提供库路径,但没有效果。所以我查看了源代码。生成错误的模块会告诉您提示(util.NativEcodeLoader):

15/06/18 18:59:23 WARN util.NativeCodeLoader: Unable to load native-hadoop    library for your platform... using builtin-java classes where applicable

下面我们来看看它的功能:

http://grepcode.com/file/repo1.maven.org/maven2/com.ning/metrics.action/0.2.6/org/apache/hadoop/util/nativecodeloader.java/

啊,有一些调试级别的日志记录-让我们打开它,看看我们是否得到一些额外的帮助。这是通过向$HADOOP_CONF_DIR/log4j.properties文件添加以下行来实现的:

log4j.logger.org.apache.hadoop.util.NativeCodeLoader=DEBUG

然后,我运行了一个生成原始警告的命令,如stop-dfs.sh,得到了以下好消息:

15/06/18 19:05:19 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: /opt/hadoop/lib/native/libhadoop.so.1.0.0: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /opt/hadoop/lib/native/libhadoop.so.1.0.0)

这个调试消息片段揭示了答案(与前面的ldd命令“试图”告诉我的内容相同:

`GLIBC_2.14' not found (required by opt/hadoop/lib/native/libhadoop.so.1.0.0)

我有什么版本的GLIBC?下面是一个简单的小窍门:

[hadoop@VMWHADTEST01 hadoop]$ ldd --version
ldd (GNU libc) 2.12

所以,不能把我的操作系统更新到2.14。唯一的解决方案是从我的操作系统上的源代码构建本机库,或者取消警告,现在就忽略它。我现在选择只是抑制恼人的警告(但确实计划在将来从源代码中构建),使用我们用来获取调试消息的相同日志记录选项购买,只不过现在,只是将其设置为错误级别。

log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR

我希望这能帮助其他人看到开放源码软件的一大好处是,如果你采取一些简单的逻辑步骤,你就能把这些东西弄清楚。