Hadoop"无法为您的平台加载native-hadoop库"警告

Ols*_*nsk 256 java linux hadoop java.library.path hadoop2

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

WARN util.NativeCodeLoader:无法为您的平台加载native-hadoop库...使用适用的builtin-java类

我正在运行Hadoop 2.2.0.

在线搜索提出了这个链接:http://balanceandbreath.blogspot.ca/2013/01/utilnativecodeloader-unable-to-load.html

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

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

export HADOOP_OPTS ="$ HADOOP_OPTS -Djava.library.path =/usr/local/hadoop/lib /"

export HADOOP_COMMON_LIB_NATIVE_DIR ="/ usr/local/hadoop/lib/native /"

有任何想法吗?

zhu*_*ala 220

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

无论如何,这只是一个警告,不会影响Hadoop的功能.

如果您想要消除此警告,下载Hadoop的源代码并libhadoop.so.1.0.0在64位系统上重新编译,然后替换32位系统,则可以使用以下方法.

Ubuntu包含了如何重新编译源代码的步骤:

祝好运.

  • 即使这不起作用,它仍然有用.这会影响性能吗? (6认同)
  • 不适合我.给我相同的无法为您的平台错误加载native-hadoop库. (5认同)
  • 我在 Centos 7 和 Centos 6.5 上使用相同的 hadoop 2.5.0 tar。两者都是 64 位操作系统。Centos7 上没有这样的警告,但是 Centos 6.5 给了我这个警告,为什么? (2认同)

Hoa*_*ong 145

只需在您的喜欢中添加原生单词HADOOP_OPTS:

export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native"
Run Code Online (Sandbox Code Playgroud)

PS:谢谢Searene

  • export HADOOP_OPTS =" - Djava.library.path = $ HADOOP_HOME/lib/native" (23认同)
  • 我认为,两种解决方案是相同的。根据 [doc](https://docs.oracle.com/javase/7/docs/api/java/lang/System.html),*java.library.path* 是加载时要搜索的路径列表图书馆。因此,您可以在 java 命令行中导出 *LD_LIBRARY_PATH* 或使用 *-D* 选项。在 java 命令行中,*-D<property>=value* 允许我们设置系统属性值。 (2认同)

chr*_*gle 49

答案取决于......我刚从64位CentOS 6.6上的tarball安装了Hadoop 2.6.Hadoop安装确实带有预构建的64位本机库.对于我的安装,它在这里:

/opt/hadoop/lib/native/libhadoop.so.1.0.0
Run Code Online (Sandbox Code Playgroud)

我知道它是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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,我愚蠢地忽略了那里的答案,正如我所关注的那样盯着我,"这个库是32位64位吗?":

`GLIBC_2.14' not found (required by ./libhadoop.so.1.0.0)
Run Code Online (Sandbox Code Playgroud)

所以,经验教训.无论如何,其余的至少让我能够压制警告.所以我继续并在其他答案中做了所有建议,使用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
Run Code Online (Sandbox Code Playgroud)

所以,到这里看看它做了什么:

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
Run Code Online (Sandbox Code Playgroud)

然后我运行了一个生成原始警告的命令,比如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)
Run Code Online (Sandbox Code Playgroud)

答案在调试消息的这个片段中显示(与之前的ldd命令'试过'告诉我的相同:

`GLIBC_2.14' not found (required by opt/hadoop/lib/native/libhadoop.so.1.0.0)
Run Code Online (Sandbox Code Playgroud)

我有什么版本的GLIBC?这是一个简单的技巧:

[hadoop@VMWHADTEST01 hadoop]$ ldd --version
ldd (GNU libc) 2.12
Run Code Online (Sandbox Code Playgroud)

所以,无法将我的操作系统更新到2.14.唯一的解决方案是从我的操作系统上的源构建本机库或抑制警告,暂时忽略它.我现在选择仅仅抑制恼人的警告(但是计划在将来从源构建)使用我们用于获取调试消息的相同日志记录选项购买,除了现在,只需将其设置为ERROR级别.

log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR
Run Code Online (Sandbox Code Playgroud)

我希望这有助于其他人看到开源软件的一大好处是,如果你采取一些简单的逻辑步骤,你可以解决这个问题.

  • 谢谢先生这个精美详细的答案.我得到了答案,并在此过程中学到了一些有价值的东西(一些事). (3认同)

小智 22

我遇到过同样的问题.它通过添加以下行来解决.bashrc:

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
Run Code Online (Sandbox Code Playgroud)

  • 我必须将"/ native"添加到HADOOP_OPTS值 (5认同)

小智 21

在我的情况下,在我的64位Linux薄型操作系统上构建hadoop后,我替换了本机库hadoop/lib.问题仍然存在.然后我发现hadoop指向hadoop/lib不是hadoop/lib/native.所以我只是将所有内容从本地库移动到其父级.警告刚刚消失.


Nag*_*D N 13

经过KotiI建议的持续研究后,我们解决了这个问题.

hduser@ubuntu:~$ cd /usr/local/hadoop

hduser@ubuntu:/usr/local/hadoop$ ls

bin  include  libexec      logs        README.txt  share
etc  lib      LICENSE.txt  NOTICE.txt  sbin

hduser@ubuntu:/usr/local/hadoop$ cd lib

hduser@ubuntu:/usr/local/hadoop/lib$ ls
native

hduser@ubuntu:/usr/local/hadoop/lib$ cd native/

hduser@ubuntu:/usr/local/hadoop/lib/native$ ls

libhadoop.a       libhadoop.so        libhadooputils.a  libhdfs.so
libhadooppipes.a  libhadoop.so.1.0.0  libhdfs.a         libhdfs.so.0.0.0

hduser@ubuntu:/usr/local/hadoop/lib/native$ sudo mv * ../
Run Code Online (Sandbox Code Playgroud)

干杯


Kal*_*osh 11

这也可行:

export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。如果您覆盖 LD_LIBRARY_PATH 以便使用 tomcat apr,只需将 hadoop 本机路径附加为 `export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/hadoop/lib/native。 (2认同)
  • 这仅适合我的解决方案。(尝试了所有其他答案)。 (2认同)

Phi*_*ien 11

对于通过Homebrew安装Hadoop的OSX上的用户,请按照以下步骤在适当的位置替换路径和Hadoop版本

wget http://www.eu.apache.org/dist/hadoop/common/hadoop-2.7.1/hadoop-2.7.1-src.tar.gz
tar xvf hadoop-2.7.1-src.tar.gz
cd hadoop-2.7.1-src
mvn package -Pdist,native -DskipTests -Dtar
mv lib /usr/local/Cellar/hadoop/2.7.1/
Run Code Online (Sandbox Code Playgroud)

然后使用更新hadoop-env.sh

export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -Djava.security.krb5.realm= -Djava.security.krb5.kdc= -Djava.library.path=/usr/local/Cellar/hadoop/2.7.1/lib/native"
Run Code Online (Sandbox Code Playgroud)


小智 10

export JAVA_HOME=/home/hadoop/software/java/jdk1.7.0_80
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_COMMON_LIB_NATIVE_DIR"
Run Code Online (Sandbox Code Playgroud)


use*_*544 8

@zhutoulala - FWIW您的链接为我使用Hadoop 2.4.0,但有一个例外我不得不告诉maven不要构建javadoc.我也在2.4.0的第一个链接中使用了补丁,它工作正常.这是我必须发出的maven命令

mvn package -Dmaven.javadoc.skip=true -Pdist,native -DskipTests -Dtar
Run Code Online (Sandbox Code Playgroud)

在构建并移动库之后,不要忘记更新hadoop-env.sh :)

认为这可能会帮助遇到与我一样的障碍的人


小智 5

将已编译的本机库文件移动到$HADOOP_HOME/lib文件夹.

然后通过编辑.bashrc文件设置环境变量

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib  
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib"
Run Code Online (Sandbox Code Playgroud)

确保已编译的本机库文件位于$HADOOP_HOME/lib文件夹中.

它应该工作.