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

2024-09-30 14:00:00
admin
原创
93
摘要:问题描述:我目前正在运行CentOs 的服务器上配置 Hadoop 。当我运行start-dfs.sh或 时stop-dfs.sh,出现以下错误:警告 util.NativeCodeLoader:无法为您的平台加载本机 Hadoop 库...使用适用的内置 Java 类我正在运行Hadoop 2.2.0。 在...

问题描述:

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

警告 util.NativeCodeLoader:无法为您的平台加载本机 Hadoop 库...使用适用的内置 Java 类

我正在运行Hadoop 2.2.0。

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

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

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

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

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

有什么想法吗?


解决方案 1:

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

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

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

对于 Ubuntu,如何重新编译源代码的步骤如下:

解决方案 2:

只需将native一词附加到您的词库中即可HADOOP_OPTS,如下所示:

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

附言:感谢Searene

解决方案 3:

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

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

解决方案 4:

我遇到了同样的问题。通过添加以下几行可以解决.bashrc

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

解决方案 5:

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

解决方案 6:

这也行得通:

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

解决方案 7:

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

干杯

解决方案 8:

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"

解决方案 9:

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

解决方案 10:

@zhutoulala -- 仅供参考,您的链接对我的 Hadoop 2.4.0 有效,但有一个例外,我必须告诉 maven 不要构建 javadocs。我还使用了第一个链接中针对 2.4.0 的补丁,它运行良好。这是我必须发出的 maven 命令

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

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

我觉得这可能会帮助那些和我遇到同样障碍的人

解决方案 11:

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

它应该可以工作。

解决方案 12:

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

解决方案 13:

就在这里这一行:

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

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

$ source ~/.bashrc

解决方案 14:

就在这里这一行:

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

KunBetter 的回答是钱在哪里

解决方案 15:

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

第一个链接 ( http://www.ercoppa.org/posts/how-to-compile-apache-hadoop-on-ubuntu-linux.html )中给出的高级步骤是正确的。在此 URL http://www.instructables.com/id/Native-Hadoop-260-Build-on-Pi/上,您可以获得有关 Raspberry Pi 的更多详细信息,但不包含 Hadoop 版本 2.8 的详细信息。

以下是我对 Hadoop 2.8 的评价:

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

解决方案 16:

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

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

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

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

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

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

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

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

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

解决方案 17:

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

解决方案 18:

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

用您的用户名替换用户

解决方案 19:

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

导出 HADOOP_OPTS = “$HADOOP_OPTS”-Djava.library.path = /usr/local/hadoop/lib
导出 HADOOP_COMMON_LIB_NATIVE_DIR =“在/usr/local/hadoop/lib/native”

解决方案 20:

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

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_OPT`hadoop-env.sh`

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

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

解决方案 21:

第一:可以修改glibc的版本,CentOS传统上提供的都是比较安全的软件,这也就意味着glibc、protobuf等版本比较旧...

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

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

其次:如果当前glibc版本比较旧,可以更新glibc。
下载Glibc

如果当前 glibc 的版本正确,你可以在 HADOOP_OPTS 中添加 native 一词

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

解决方案 22:

将 Hadoop 本机库添加到 .bashrc 文件中的 LD_LIBRARY_PATH,然后使用 source ~/.bashrc 将库重新加载到当前会话中

export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native

(或)如果您在 /usr/lib/ 安装了 Hadoop 库

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

解决方案 23:

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

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

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

解决方案 24:

安装 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 中转到主页,单击 Hue 和 Hue Web UI。这样您就可以访问 Hive、Pig、Sqoop 等。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用