Hadoop“无法为您的平台加载原生Hadoop库”警告
我目前在运行CentOs的服务器上configurationhadoop。 当我运行start-dfs.sh
或stop-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的重新编译源代码的步骤:
- http://www.ercoppa.org/Linux-Compile-Hadoop-220-fix-Unable-to-load-native-hadoop-library.htm
- http://www.csrdu.org/nauman/2014/01/23/geting-started-with-hadoop-2-2-0-building/
祝你好运。
只需将以下单词添加到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
所以,到这里看看它是做什么的:
啊,有一些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/lib
replace了本地库。 问题仍然存在。 然后我想出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用户