答案取决于……我刚刚在64位CentOS 6.6上从tarball安装了Hadoop 2.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添加以下行来完成的。属性文件:
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。唯一的解决方案是从我的操作系统上的源代码构建本机库,或者压制警告并暂时忽略它。我选择暂时屏蔽这个恼人的警告(但计划将来从源代码构建),使用与获取调试消息相同的日志记录选项,只是现在将其设置为ERROR级别。
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR
我希望这能帮助其他人看到,开源软件的一大好处是,如果您采取一些简单的逻辑步骤,就可以解决这些问题。