Hadoop“无法为您的平台加载原生Hadoop库”警告

我目前在运行CentOs的服务器上configurationhadoop。 当我运行start-dfs.shstop-dfs.sh ,出现以下错误:

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

我正在运行Hadoop 2.2.0。

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

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

我也在hadoop-env.sh添加了这两个环境variables:

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

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

有任何想法吗?

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

无论如何,这只是一个警告,并不会影响Hadoop的function。

如果你想消除这个警告,下载Hadoop的源代码,并在64位系统上重新编译libhadoop.so.1.0.0 ,然后replace32位系统。

这里包括Ubuntu的重新编译源代码的步骤:

祝你好运。

只需将以下单词添加到HADOOP_OPTS

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

PS:谢谢Searene

答案取决于…我刚刚在64位CentOS 6.6上从tarball安装了Hadoop 2.6。 Hadoop安装确实带有一个预先构build的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位64位?”:

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

所以,经验教训。 无论如何,其余至less导致我能够压制这个警告。 所以我继续,并做了其他的答案build议使用HADOOP_OPTS环境variables提供库path无济于事。 所以我看了看源代码。 生成错误的模块告诉你提示( 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/

啊,有一些debugging级别的日志logging – 让我们来看看,如果我们得到一些额外的帮助。 这通过将以下行添加到$ 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) 

在debugging信息的这段代码中显示了答案(与之前的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。 唯一的解决scheme是在我的操作系统上从源代码构build本地库,或者禁止警告,现在就忽略它。 我select只是现在抑制恼人的警告(但是打算从将来的源代码构build)购买使用相同的日志logging选项,我们用来获得debugging信息,除了现在,只是使其错误水平。

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

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

就我而言,在我的64位Linux mint操作系统上构buildhadoop之后,我用hadoop/libreplace了本地库。 问题仍然存在。 然后我想出hadoop指向hadoop/lib而不是hadoop/lib/native 。 所以我只是把所有的内容从本地库移到它的父节点。 警告消失了。

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

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

如KotiI所build议的持续研究解决了这个问题。

 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 * ../ 

干杯

对于那些通过Homebrew安装Hadoop的OSX,请按照以下步骤replace适当的path和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/ 

然后更新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" 

@zhutoulala – FWIW你的链接为我工作与Hadoop 2.4.0有一个例外,我不得不告诉maven不build立javadocs。 我也在2.4.0的第一个链接中使用的修补程序,它工作正常。 这是我必须发出的maven命令

 mvn package -Dmaven.javadoc.skip=true -Pdist,native -DskipTests -Dtar 

build立这个和移动库后,不要忘记更新hadoop-env.sh 🙂

以为这可能会帮助那些遇到和我一样的障碍的人

这也可以工作:

 export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native 
 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_HOME/lib/native" 

将编译的本地库文件移动到$HADOOP_HOME/lib文件夹。

然后通过编辑.bashrc文件设置你的环境variables

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

确保你编译的本地库文件在$HADOOP_HOME/lib文件夹中。

它应该工作。

 export HADOOP_HOME=/home/hadoop/hadoop-2.4.1 export PATH=$HADOOP_HOME/bin:$PATH export HADOOP_PREFIX=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_PREFIX export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_PREFIX/lib/native export HADOOP_CONF_DIR=$HADOOP_PREFIX/etc/hadoop export HADOOP_HDFS_HOME=$HADOOP_PREFIX export HADOOP_MAPRED_HOME=$HADOOP_PREFIX export HADOOP_YARN_HOME=$HADOOP_PREFIX export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH 

这条线就在这里:

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

从坤贝特的答案是钱的地方

这条线就在这里:

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

从坤贝特的回答,为我工作。 只需将其附加到.bashrc文件并重新加载.bashrc内容即可

 $ source ~/.bashrc 

我和JDK6有同样的问题,我把JDK换成了JDK8,问题解决了。 尝试使用JDK8!

除了@zhutoulala接受的答案,这里是一个更新,使其与ARMHF平台上的最新稳定版(2.8)(Raspberry Pi 3模型B)的工作。 首先我可以确认你必须重新编译本地库到64位的ARM,这里的其他答案基于设置一些环境variables将无法正常工作。 如Hadoop文档中所示,预构build的本地库是32位的。

在拳头链接( http://www.ercoppa.org/posts/how-to-compile-apache-hadoop-on-ubuntu-linux.html )中给出的高级别步骤是正确的。 在这个urlhttp://www.instructables.com/id/Native-Hadoop-260-Build-on-Pi/上,你可以得到更多关于Raspberry Pi的细节,但不是Hadoop 2.8版。

这里是我的指示倒入Hadoop 2.8:

  • 最新的Raspbian上仍然没有protobuf包,所以你必须自己编译它,版本必须是protobuf 2.5( https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz
  • CMake文件修补方法必须改变。 更多,文件打补丁是不一样的。 不幸的是,对于2.8的JIRA没有被接受的补丁。 在这个URL( https://issues.apache.org/jira/browse/HADOOP-9320 )上,您必须复制并粘贴您的namenode上的Andreas Muttschellerbuild议的补丁:

     :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 

一旦构build成功:

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

并将Hadoop安装的lib / native目录的内容replace为此存档的内容。 运行Hadoop时的警告消息应该消失。

对于安装Hadoop来说,安装Cloudera的免费版本非常方便。 它有一个很好的graphics用户界面,可以很容易的添加节点,没有编译或者依赖的东西,它有像蜂巢,猪等东西

http://www.cloudera.com/content/support/en/downloads.html

步骤如下:1)下载2)运行3)进入网页界面(1.2.3.4:7180)4)在网页中添加额外的节点(不要在其他节点上安装cloudera软件, 5)在Web界面中,点击Home,点击Hue和Hue Web UI。 这使您可以访问Hive,Pig,Sqoop等

从以前的postvalidation补救措施:

1)检查Hadoop发行libhadoop.so.1.0.0附带的libhadoop.so.1.0.0是否为我的机器体系结构(x86_64)编译:

 [nova]:file /opt/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0 /opt/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=3a80422c78d708c9a1666c1a8edd23676ed77dbb, not stripped 

2)在hadoop-env.sh添加了-Djava.library.path=<path>HADOOP_OPT

 export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -Djava.library.path=/opt/hadoop-2.6.0/lib/native" 

这确实使烦人的警告消失。

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

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

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

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

如果当前的glibc id的版本正确,你可以在你的HADOOP_OPTS中添加本地字

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

我没有使用CentOS。 这里是我在Ubuntu 16.04.2,hadoop-2.7.3,jdk1.8.0_121。 成功运行start-dfs.sh或stop-dfs.sh没有错误:

 # JAVA env # export JAVA_HOME=/j01/sys/jdk export JRE_HOME=/j01/sys/jdk/jre export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:${PATH}:. # HADOOP env # export HADOOP_HOME=/j01/srv/hadoop export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin 

用你的安装pathreplace/ j01 / sys / jdk,/ j01 / srv / hadoop

我也在Ubuntu上进行了一次设置,在运行start-dfs.sh时不需要多次input密码:

 sudo apt install openssh-server openssh-client ssh-keygen -t rsa ssh-copy-id user@localhost 

用您的用户名replace用户