我目前正在一台运行CentOs的服务器上配置hadoop。当我运行start-dfs.sh或stop-dfs.sh时,我得到以下错误:

警告跑龙套。NativeCodeLoader:无法加载原生hadoop库 你的平台……在适用的地方使用内置java类

我运行的是Hadoop 2.2.0。

我在网上搜索了一下,找到了这个链接:http://balanceandbreath.blogspot.ca/2013/01/utilnativecodeloader-unable-to-load.html

但是,hadoop 2上的/native/目录的内容。x似乎不同,所以我不知道该怎么办。

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

出口HADOOP_OPTS = " HADOOP_OPTS美元 -Djava.library.path = / usr /地方/ hadoop / lib /” 出口HADOOP_COMMON_LIB_NATIVE_DIR = " / usr /地方/ hadoop / lib /本地/”

什么好主意吗?


当前回答

这一行:

export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH

KunBetter的回答对我很有用。 只需将其附加到.bashrc文件并重新加载.bashrc内容

$ source ~/.bashrc

其他回答

除了@zhutoulala接受的答案之外,这里是一个更新,使其能够在ARMHF平台(树莓派3模型B)上使用最新的稳定版本(2.8)。 首先,我可以确认您必须将本机库重新编译为64位ARM,这里基于设置一些环境变量的其他答案将不起作用。正如Hadoop文档中所指出的,预构建的本机库是32位的。

第一个链接(http://www.ercoppa.org/posts/how-to-compile-apache-hadoop-on-ubuntu-linux.html)中给出的高级步骤是正确的。 在这个网址http://www.instructables.com/id/Native-Hadoop-260-Build-on-Pi/上,你可以获得更多关于树莓派的详细信息,但不包括Hadoop 2.8版。

以下是我对Hadoop 2.8的建议:

there is still no protobuf package on latest Raspbian so you must compile it yourself and version must be exactly protobuf 2.5 (https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz) CMake file patching method must be changed. Moreovere, files to patch are not the same. Unfortunately, there is no accepted patch on JIRA specific to 2.8. On this URL (https://issues.apache.org/jira/browse/HADOOP-9320) you must copy and paste Andreas Muttscheller proposed patch on your namenode : :hadoop-2.8.0-src/hadoop-common-project/hadoop-common $ touch HADOOP-9320-v2.8.patch :hadoop-2.8.0-src/hadoop-common-project/hadoop-common $ vim HADOOP-9320-v2.8.patch #copy and paste proposed patch given here : https://issues.apache.org/jira/browse/HADOOP-9320?focusedCommentId=16018862&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-16018862 :hadoop-2.8.0-src/hadoop-common-project/hadoop-common $ patch < HADOOP-9320-v2.8.patch patching file HadoopCommon.cmake patching file HadoopJNI.cmake :hadoop-2.8.0-src/hadoop-common-project/hadoop-common $ cd ../.. :hadoop-2.8.0-src $ sudo mvn package -Pdist,native -DskipTests -Dtar

一旦构建成功:

    :hadoop-2.8.0-src/hadoop-dist/target/hadoop-2.8.0/lib/native $ tar -cvf nativelibs.tar *

用这个归档文件的内容替换Hadoop安装的lib/native目录的内容。运行Hadoop时的警告消息应该消失。

答案取决于……我刚刚在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

我希望这能帮助其他人看到,开源软件的一大好处是,如果您采取一些简单的逻辑步骤,就可以解决这些问题。

首先:您可以修改glibc版本。CentOS提供传统的安全软件,这也意味着版本是旧的,如glibc,protobuf…

ldd --version
ldd /opt/hadoop/lib/native/libhadoop.so.1.0.0

您可以将当前glibc的版本与所需的glibc进行比较。

其次:如果当前glibc版本较旧,可以更新glibc。 下载Glibc

如果当前glibc id的版本正确,则可以将word native附加到HADOOP_OPTS中

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

我假设您在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-Unable-to-load-native-hadoop-library.htm

这一行:

export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH

KunBetter的答案是钱在哪里