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

Java Hadoop“无法为您的平台加载本机Hadoop库”警告,java,linux,hadoop,hadoop2,java.library.path,Java,Linux,Hadoop,Hadoop2,Java.library.path,我目前正在运行CentOs的服务器上配置hadoop。当我运行start-dfs.sh或stop-dfs.sh时,出现以下错误: WARN util.NativeCodeLoader:无法加载的本机hadoop库 你的平台。。。在适用的情况下使用内置java类 我正在运行Hadoop 2.2.0 联机搜索时会出现以下链接: 但是,Hadoop2.x上/native/directory的内容似乎有所不同,因此我不确定该怎么办 我还在hadoop-env.sh中添加了这两个环境变量: 导出HADOO

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

WARN util.NativeCodeLoader:无法加载的本机hadoop库 你的平台。。。在适用的情况下使用内置java类

我正在运行Hadoop 2.2.0

联机搜索时会出现以下链接:

但是,Hadoop2.x上/native/directory的内容似乎有所不同,因此我不确定该怎么办

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

导出HADOOP\u OPTS=$HADOOP\u OPTS -Djava.library.path=/usr/local/hadoop/lib/

导出HADOOP\u COMMON\u LIB\u NATIVE\u DIR=/usr/local/HADOOP/LIB/NATIVE/


有什么想法吗?

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

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

如果您确实希望消除此警告,请下载Hadoop的源代码,并在64位系统上重新编译libhadoop.so.1.0.0,然后替换32位

关于如何重新编译Ubuntu源代码的步骤包括:


祝你好运。

要安装Hadoop,从Cloudera安装免费版本要容易得多。它附带了一个漂亮的GUI,使添加节点变得简单,没有编译或填充依赖项,它附带了诸如hive、pig等内容

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

@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:


在我的例子中,我在64位LinuxMint操作系统上构建hadoop之后,我替换了hadoop/lib中的本机库。但问题依然存在。然后我发现hadoop指向hadoop/lib而不是hadoop/lib/native。所以我只是将所有内容从本机库移动到其父库。警告刚刚消失。

我也有同样的问题。可以通过在.bashrc中添加以下行来解决此问题:

只需将word native添加到HADOOP选项中,如下所示:

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

PS:Thank

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

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

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

它应该可以工作。

这也可以工作:

export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native
这一行就在这里:

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

昆贝特的答案是钱在哪里

答案取决于。。。我刚刚在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位还是64位的时候,我盯着我的脸看:

`GLIBC_2.14' not found (required by ./libhadoop.so.1.0.0)
因此,我们吸取了教训。不管怎么说,剩下的至少让我能够抑制这个警告。因此,我继续并做了其他答案中推荐的所有事情,使用HADOOP_OPTS环境变量提供库路径,但没有效果。所以我看了源代码。生成错误的模块告诉您提示util.NativeCodeLoader:

所以,到这里来看看它的功能:

啊,这里有一些调试级别的日志记录-让我们打开它,看看是否能得到一些额外的帮助。通过将以下行添加到$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。唯一的解决方案是从我的操作系统上的源代码构建本机库,或者抑制警告,暂时忽略它。我选择暂时不显示这个恼人的警告,但我确实计划在将来使用我们用来获取调试消息的相同日志记录选项从源代码构建,除了现在,只需将其设置为错误级别

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

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

验证了先前帖子中的补救措施:

我检查了一下 Hadoop发行版附带的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将-Djava.library.path=添加到HADOOP_OPT in HADOOP-env.sh中:

这确实让恼人的警告消失了。

这行就在这里:

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

对于那些在OSX上通过自制安装Hadoop的用户,请按照以下步骤替换路径和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"

首先,你可以修改glibc版本。CentOS传统上提供安全软件,这也意味着该版本很旧,例如glibc、protobuf

ldd --version
ldd /opt/hadoop/lib/native/libhadoop.so.1.0.0
您可以将当前glibc的版本与所需的glibc进行比较

第二:如果当前glibc的版本是旧的,您可以更新glibc。

如果当前glibc id的版本正确,您可以将word native附加到HADOOP选项中

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

在按照科蒂的建议进行持续研究后,问题得到了解决

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

干杯

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

我没有使用CentOS。以下是我在Ubuntu 16.04.2、hadoop-2.7.3、jdk1.8.0121中看到的内容。成功运行start-dfs.sh或stop-dfs.sh,无错误:

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

将用户替换为您的用户名

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

第一个链接中给出的高级步骤是正确的。 在这个url上,您可以获得更多特定于Raspberry Pi的详细信息,但Hadoop 2.8版除外

以下是我对Hadoop 2.8的建议:

在最新的Raspbian上仍然没有protobuf包,所以您必须自己编译它,并且版本必须完全是protobuf 2.5 必须更改CMake文件修补方法。此外,要修补的文件也不相同。不幸的是,JIRA上没有针对2.8的可接受补丁。在此URL上,您必须复制并将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安装的lib/native目录的内容替换为此存档的内容。运行Hadoop时的警告消息应该消失

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

export HADOOP_OPTS = "$HADOOP_OPTS"-Djava.library.path = /usr/local/hadoop/lib 本机hadoop库仅在*nix平台上受支持。该库不允许与Cygwin或Mac OS X平台一起使用

参考文献:


如果您使用的是Windows或Mac OS X,则需要将平台更改为*nix。

对我不起作用。对于您的平台错误,我同样无法加载本机hadoop库。即使这不起作用,它仍然很有用。那么这会影响性能吗?我在Centos 7和Centos 6.5上使用相同的hadoop 2.5.0 tar。两者都是64位操作系统。Centos 7上没有这样的警告,但Centos 6.5给了我这个警告,为什么?谢谢。我没有意识到这是一个警告。实际上,启动namenode和最后一句话无法加载本机hadoop。。这引起了恐惧。请注意,实际上您不必编译整个Hadoop,正如说明所建议的那样-Hadoop common project/Hadoop common和Hadoop hdfs project/Hadoop hdfs就足够了。我只是碰巧在网上尝试了所有方法。我累了,只清空了lib文件夹中的所有文件,即使用上面答案中提供的链接编译的文件。最后,我不知道为什么尽管你投了反对票,但我还是尝试了你的建议,经过一天的努力,我终于成功了。不管我是在.bashrc还是hadoop-env.sh中更改了本机库的位置。非常感谢。我累了,只清空了lib文件夹中的所有本机文件夹文件,即使用新hadoop-2.4.0-src.tar.gz中上述answer本机文件夹中提供的链接编译的文件,您应该通过hadoop资源重新编译64位lib/native。Cloudera发行版比许多软件包的当前版本落后很多倍。如果您想要最新和最好的版本,Apache Hadoop是实现搜索能力的最佳途径:这个问题至少也适用于Hadoop 2.4.0、Hadoop 2.4.1和其他版本。关于如何使用本机库的文档位于,我必须向Hadoop添加/native\u OPTS值对我不起作用。将/native添加到.zshrc中的HADOOP_OPTS并将其源代码化,在我的情况下,不需要二者:export JAVA_LIBRARY_PATH=$HADOOP
_HOME/lib/native:$JAVA\u LIBRARY\u PATH和export LD\u LIBRARY\u PATH=$HADOOP\u HOME/lib/native:$LD\u LIBRARY\u PATH我在本地系统中使用的是HADOOP-2.6.0版本。我也面临同样的问题。然后我下载了hadoop-2.7.1-src并构建了二进制和本机库,还用新构建的本机库替换了本机库hadoop-2.6.0。但我还是犯了同样的错误。然后我导出JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH,它对我有效。这也对我有效。在使用Hadoop 2.6的Ubuntu上,路径是/home/user/Hadoop-2.6.0/lib/nativeexport Hadoop_OPTS=-Djava.library.path=$Hadoop_home/lib/nativeI我想,两种解决方案是相同的。根据,java.library.path是加载库时要搜索的路径列表。所以,您可以导出LD_LIBRARY_PATH或在java命令行中使用-D选项。在java命令行中,-D=value允许我们设置一个系统属性值。它修正了警告汉克斯·菲利普的问题。这个解决方案非常有效。在我的例子中,我所需要的只是选项Djava.library.path。这正是我想要的。谢谢非常感谢。我有bzip2:false,openssl:false构建不支持openssl。其他人已经找到了路径。有什么建议吗?谢谢你的详细回答。我得到了答案,在这个过程中学到了一些有价值的东西。谢谢。如果为了使用tomcat apr而重写LD_LIBRARY_PATH,只需将hadoop本机路径附加为`export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/hadoop/lib/native。这只适用于我。尝试了所有其他答案。
sudo apt install openssh-server openssh-client
ssh-keygen -t rsa
ssh-copy-id user@localhost
: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 *
export HADOOP_OPTS = "$HADOOP_OPTS"-Djava.library.path = /usr/local/hadoop/lib export HADOOP_COMMON_LIB_NATIVE_DIR = "/usr/local/hadoop/lib/native"