Hadoop“无法为您的平台加载本地hadoop库”警告


269

我目前正在运行CentO的服务器上配置hadoop 。运行start-dfs.sh或时stop-dfs.sh,出现以下错误:

WARN util.NativeCodeLoader:无法为您的平台加载本地hadoop库...在适当情况下使用内置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 /”

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

有任何想法吗?


3
对于可搜索性:此问题至少也适用于Hadoop 2.4.0,Hadoop 2.4.1以及可能的其他版本。
格雷格·杜比奇

Answers:


227

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

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

如果您确实想消除此警告,请采取以下方法:下载Hadoop的源代码并libhadoop.so.1.0.0在64位系统上重新编译,然后替换32位。

对于Ubuntu,此处包含有关如何重新编译源代码的步骤:

祝好运。


7
对我不起作用。给我同样的无法为平台错误加载本地hadoop库。
Akshay Hazari 2014年

7
即使这并不完全有效,它仍然会有所帮助。那么,这会完全影响性能吗?
WattsInABox 2014年

1
我在Centos 7和Centos 6.5上使用相同的hadoop 2.5.0 tar。两者都是64位操作系统。Centos7上没有这样的警告,但是Centos 6.5给我这个警告,为什么?
桑迪普

谢谢。我没有意识到这是一个警告。实际上说的是“ starting namenode”,最后一句话是“ Unable to load native-hadoop ..”,这引起了恐惧。
Kaushik Lele 2015年

请注意,你其实不必编译整个Hadoop的,作为指导建议- hadoop-common-project/hadoop-common并且hadoop-hdfs-project/hadoop-hdfs是足够的。
格雷格·杜比奇

152

只需将原单词附加到您的HADOOP_OPTS这样:

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

PS:感谢Searene


这也为我做到了。在具有Hadoop 2.6的Ubuntu上,路径为/home/user/hadoop-2.6.0/lib/native
pelazem

25
出口HADOOP_OPTS = “ - Djava.library.path = $ HADOOP_HOME / lib目录/原生”
Searene酒店

1
我认为,两种解决方案是相同的。根据docjava.library.path是加载库时要搜索的路径的列表。这样,您可以导出LD_LIBRARY_PATH或在Java命令行中使用-D选项。在java命令行中,-D <property> = value允许我们设置系统属性值。
Hoai-Thu Vuong

54

答案取决于...我刚刚从tarball在64位CentOS 6.6上安装了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。唯一的解决方案是从我的OS上的源代码构建本机库,或者取消显示警告并暂时将其忽略。我选择暂时不显示恼人的警告(但将来计划从源构建)使用与获取调试消息相同的日志记录选项进行购买,只是现在将其设置为ERROR级别。

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

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


4
先生,谢谢您提供的精美详细的答案。我得到了答案,并在此过程中学到了一些有价值的东西。
dogwynn

26

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

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

5
我必须在HADOOP_OPTS值中添加“ / native”
阿拉

21

就我而言,在64位Linux Mint OS上构建hadoop之后,我将本地库替换为 hadoop/lib。问题仍然存在。然后我找出了指点指着hadoop/lib不指的东西hadoop/lib/native。因此,我只是将所有内容从本机库移至其父库。警告刚刚消失。


我刚巧尝试了网上的所有内容。我很累,只是清空了lib文件夹本身中的所有文件,即使用上述答案中提供的链接编译的文件。最终我不知道为什么尽管你已经投了反对票,但我还是尝试了你的建议,但在经过了一天的艰苦努力之后,它仍然起作用了。我是否更改了.bashrc中的本机库位置都没有关系或hadoop-env.sh。谢谢一吨。
Akshay Hazari 2014年

我累了,只是清空所有的本地文件夹中的文件在lib文件夹本身,即使用在上面的回答中提供的链接编译后的(在新的Hadoop-2.4.0-src.tar.gz本地文件夹。)
阿克沙伊Hazari

15

这也将起作用:

export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native

1
谢谢。如果您为了使用tomcat apr而覆盖LD_LIBRARY_PATH,只需将hadoop本机路径附加为`export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:/ usr / lib / hadoop / lib / native。
艾瑞克(Eric)

这仅对我有效。(尝试了所有其他答案)。
sailfish009

13

经过Koti建议的持续研究后,我解决了该问题。

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

干杯


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/

然后使用以下命令更新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"

谢谢菲利普。该解决方案非常完美。就我而言,我所需要的只是选项Djava.library.path。那正是我想要的。谢谢!!!
arcee123 '16

非常感谢。我有bzip2:false,openssl:false版本不支持openssl。其他人有路径出现。有什么建议。
ggorantl

11
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"

8

@zhutoulala-FWIW,您的链接对Hadoop 2.4.0来说对我有用,但有一个例外,我不得不告诉maven不要构建javadocs。我还在2.4.0的第一个链接中使用了补丁,并且工作正常。这是我必须发出的Maven命令

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

构建完这些并移动了库之后,请不要忘记更新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"

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

它应该工作。


2
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

是的,您应该已经通过hadoop资源重新编译了64位lib / native。
2014年

2

这行就在这里:

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

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

$ source ~/.bashrc

我在本地系统中使用hadoop-2.6.0版本。我也面临着同样的问题。然后,我下载了hadoop-2.7.1-src并构建了二进制和本机库,还用新构建的本机替换了本机库hadoop-2.6.0。但是我仍然遇到同样的错误。然后我export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH和它为我工作。
ParagFlume

1

这行就在这里:

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

昆贝特的答案是钱在哪里


就我而言,我同时需要:export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATHexport LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH
borice

1

我在使用JDK6时遇到了同样的问题,我将JDK更改为JDK8,问题得以解决。尝试使用JDK8 !!!


1

除了@zhutoulala可接受的答案之外,这是一个更新,使其可以在ARMHF平台(Raspberry Pi 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/您可以获得有关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文件修补方法必须更改。此外,要修补的文件不相同。不幸的是,JIRA没有针对2.8的可接受补丁。在此URL(https://issues.apache.org/jira/browse/HADOOP-9320)上,您必须将Andreas Muttscheller建议的补丁复制并粘贴到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时的警告消息应消失。


0

对于安装Hadoop,从Cloudera安装免费版本要容易得多。它带有一个不错的GUI,使添加节点变得简单,没有编译或填充依赖项,它带有诸如hive,pig之类的东西。

http://www.cloudera.com/content/support/zh-CN/downloads.html

步骤是:1)下载2)运行它3)转到Web GUI(1.2.3.4:7180)4)在Web GUI中添加其他节点(不要在其他节点上安装cloudera软件,它会为您完成所有操作) 5)在Web GUI中,转到“主页”,单击“ Hue”和“ Hue Web UI”。这使您可以访问Hive,Pig,Sqoop等。


Cloudera发行版比许多软件包的当前版本落后很多时间。如果您想要“最新,最伟大”,那么Apache Hadoop是必经之路
Nerrve

0

经过验证的较早发布的补救措施:

1)检查libhadoop.so.1.0.0Hadoop发行版随附的软件是否针对我的机器架构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)添加-Djava.library.path=<path>HADOOP_OPThadoop-env.sh

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

这的确使恼人的警告消失了。


0

首先:您可以修改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"

0

我没有使用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

用安装路径替换/ j01 / sys / jdk,/ j01 / srv / hadoop

我还在Ubuntu上进行了一次以下设置,从而消除了在运行start-dfs.sh时多次输入密码的需要:

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

用您的用户名替换用户


0

基本上,这不是错误,而是Hadoop集群中的警告。在这里,我们只更新环境变量。

导出HADOOP_OPTS =“ $ HADOOP_OPTS” -Djava.library.path = / usr / local / hadoop / lib
 导出HADOOP_COMMON_LIB_NATIVE_DIR =“ / usr / local / hadoop / lib / native”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.