299

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

WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... 在适用的情况下使用内置 java 类

我正在运行Hadoop 2.2.0。

在线搜索出现了这个链接:http ://balanceandbreath.blogspot.ca/2013/01/utilnativecodeloader-unable-to-load.html

但是,/native/hadoop 2.x 上的目录内容似乎有所不同,所以我不确定该怎么做。

我还在以下位置添加了这两个环境变量hadoop-env.sh

导出 HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=/usr/local/hadoop/lib/"

导出 HADOOP_COMMON_LIB_NATIVE_DIR="/usr/local/hadoop/lib/native/"

有任何想法吗?

4

23 回答 23

249

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

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

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

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

祝你好运。

于 2013-11-15T04:12:32.697 回答
166

只需像这样将本机词附加到您的HADOOP_OPTS后面:

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

PS:感谢Searene

于 2014-07-24T07:10:24.103 回答
58

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

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

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

于 2015-06-18T23:45:27.373 回答
30

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

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
于 2014-07-20T19:57:28.113 回答
24

就我而言,在我的 64 位 Linux mint 操作系统上构建 hadoop 后,我替换了hadoop/lib. 问题仍然存在。然后我发现 hadoop 指向hadoop/lib不指向hadoop/lib/native. 所以我只是将所有内容从本机库移动到其父库。警告就消失了。

于 2014-06-11T06:13:12.470 回答
18

这也可行:

export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native
于 2014-11-28T14:54:58.290 回答
14

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

干杯

于 2015-12-28T19:52:37.743 回答
14
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"
于 2016-09-28T05:30:44.767 回答
13

对于那些在 OSX 上通过 Homebrew 安装 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"
于 2015-12-09T11:54:20.600 回答
9

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

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

于 2014-04-26T05:47:22.243 回答
6

将已编译的本机库文件移动到$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文件夹中。

它应该工作。

于 2014-10-12T18:56:19.560 回答
3
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
于 2014-08-15T01:10:39.830 回答
3

这一行就在这里:

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

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

$ source ~/.bashrc
于 2015-09-27T13:21:39.367 回答
2

这一行就在这里:

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

来自KunBetter的答案是钱在哪里

于 2015-04-07T23:31:03.017 回答
2

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

于 2016-06-17T03:18:16.533 回答
2

除了@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 建议的补丁复制并粘贴到您的名称节点上:

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

于 2017-07-10T09:18:48.403 回答
1

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

用您的用户名替换用户

于 2017-03-24T18:01:23.810 回答
1

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

导出 HADOOP_OPTS = "$HADOOP_OPTS"-Djava.library.path = /usr/local/hadoop/lib
导出 HADOOP_COMMON_LIB_NATIVE_DIR = "/usr/local/hadoop/lib/native"
于 2020-06-07T17:52:24.853 回答
1

这个答案是@chromeeagle 的分析这个链接 (Nan-Xiao)的混合。

对于那些其他解决方案根本不起作用的人,请按照以下步骤操作:

  1. 编辑文件$HADOOP_HOME/etc/hadoop/log4j.properties(感谢@chromeeagle)。在末尾添加一行:

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

  2. 启动你的 spark/pyspark shell。您将看到有关未加载本机库的其他日志信息。就我而言,我有以下错误:

    Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: no hadoop in java.library.path

  3. 要解决此特定问题,请将 Hadoop 本机库路径添加到LD_LIBRARY_PATH用户配置文件中的环境变量:

    export LD_LIBRARY_PATH="$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH"

希望这可以帮助。我在几个 HADOOP 安装中遇到了这个问题,它对两者都有效。

于 2021-07-07T17:02:51.630 回答
0

首先:可以修改glibc版本。CentOS传统上提供安全软件,也意味着glibc、protobuf等版本老了。

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

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

其次:如果当前glibc的版本老了,可以更新glibc。 下载 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"
于 2015-12-27T04:36:45.577 回答
0

从之前的帖子中得到验证的补救措施:

1) 检查libhadoop.so.1.0.0附带的 Hadoop 发行版是为我的机器架构编译的,即 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"

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

于 2015-07-24T16:19:51.780 回答
0

本机 hadoop 库仅在 *nix 平台上受支持。该库不适用于 Cygwin 或 Mac OS X 平台。

参考:https ://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/NativeLibraries.html

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

于 2021-03-27T07:30:39.080 回答
-1

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

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 等。

于 2014-03-20T23:46:49.363 回答