答案取决于...我刚刚在 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.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。唯一的解决方案是从我的操作系统上的源代码构建本机库或抑制警告并暂时忽略它。我选择暂时抑制烦人的警告(但计划将来从源代码构建)使用我们用来获取调试消息的相同日志记录选项购买,除了现在,只需将其设为 ERROR 级别。
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR
我希望这可以帮助其他人看到开源软件的一大好处是,如果你采取一些简单的逻辑步骤,你就可以弄清楚这些东西。