java.library.path hadoop_java - Hadoop“无法为您的平台加载native-hadoop库”警告

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

我目前正在运行CentOs的服务器上配置hadoop。 当我运行hadoop-env.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]

但是,hadoop 2.x上的hadoop-env.sh目录的内容似乎有所不同,所以我不知道该怎么办。

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

export HADOOP_OPTS =“$ HADOOP_OPTS  -Djava.library.path=的/ usr /本地/ hadoop的/ LIB /”

export HADOOP_COMMON_LIB_NATIVE_DIR =“/ usr / local / hadoop / lib / native /”

有任何想法吗?

20个解决方案

200 votes

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

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

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

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

[http://www.ercoppa.org/Linux-Compile-Hadoop-220-fix-Unable-to-load-native-hadoop-library.htm]

祝好运。

zhutoulala answered 2019-02-24T00:03:15Z

119 votes

只需在您的HADOOP_OPTS上添加原生单词,如下所示:

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

PS:谢谢Searene

Hoai-Thu Vuong answered 2019-02-24T00:03:48Z

44 votes

答案取决于......我刚从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):

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

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

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

chromeeagle answered 2019-02-24T00:05:30Z

21 votes

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

koti answered 2019-02-24T00:05:56Z

20 votes

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

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

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

Neeraj answered 2019-02-24T00:06:21Z

13 votes

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

干杯

Nagarjuna D N answered 2019-02-24T00:06:48Z

10 votes

这也可行:

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

Kalyan Ghosh answered 2019-02-24T00:07:13Z

10 votes

对于通过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"

Philip O'Brien answered 2019-02-24T00:07:45Z

8 votes

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

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

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

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

user2229544 answered 2019-02-24T00:08:25Z

7 votes

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"

li li answered 2019-02-24T00:08:43Z

5 votes

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

然后通过编辑$HADOOP_HOME/lib文件来设置环境变量

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib

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

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

它应该工作。

Vijayakumar answered 2019-02-24T00:09:29Z

1 votes

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

KunBetter answered 2019-02-24T00:09:48Z

1 votes

这一行就在这里:

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

从KunBetter的回答是钱的来源

Tom Kelly answered 2019-02-24T00:10:23Z

1 votes

这一行就在这里:

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

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

$ source ~/.bashrc

BeingSachin answered 2019-02-24T00:10:53Z

1 votes

我和JDK6有同样的问题,我将JDK改为JDK8,问题解决了。尝试使用JDK8 !!!

MangoJo answered 2019-02-24T00:11:19Z

1 votes

除了@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]]上,您必须在您的namenode上复制并粘贴Andreas Muttscheller建议的补丁:

: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时的警告消息应该消失。

mattt answered 2019-02-24T00:12:35Z

0 votes

对于安装Hadoop,安装Cloudera的免费版本要容易得多。 它带有一个漂亮的GUI,可以很容易地添加节点,没有编译或填充依赖项,它带有像蜂巢,猪等的东西。

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

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

MikeKulls answered 2019-02-24T00:13:16Z

0 votes

早期帖子验证的补救措施:

1)检查Hadoop发行版附带的-Djava.library.path=是否为我的机器架构编译,即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,电子邮件:hadoop-env.sh:

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

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

piiteraq answered 2019-02-24T00:14:02Z

0 votes

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

ldd --version

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

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

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

如果当前glibc id的版本正确,您可以将单词native替换为HADOOP_OPTS

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

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

Qidong Wang answered 2019-02-24T00:14:48Z

0 votes

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

用您的用户名替换用户

Jonathan L answered 2019-02-24T00:15:35Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值