我目前正在运行 CentOS 的服务器上配置 hadoop。当我运行start-dfs.sh
或stop-dfs.sh
时,出现以下错误:
警告实用程序。NativeCodeLoader:无法加载 的原生 hadoop 库 您的平台...在适用的情况下使用内置的 Java 类
我正在运行Hadoop 2.2.0。
在线搜索显示此链接:http://balanceandbreath.blogspot.ca/2013/01/utilnativecodeloader-unable-to-load.html
但是,Hadoop2.x上/native/
目录的内容似乎不同,所以我不确定该怎么做。
我还在hadoop-env.sh
中添加了这两个环境变量:
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=/usr/local/hadoop/lib/"
export HADOOP_COMMON_LIB_NATIVE_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 中:
- http://www.ercoppa.org/Linux-Compile-Hadoop-220-fix-Unable-to-load-native-hadoop-library.htm
只需将原生单词附加到您的HADOOP_OPTS
中,如下所示:
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native"
PS:谢谢西琳
答案取决于...我刚刚在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。唯一的解决方案是从我的操作系统上的源代码构建本机库,或者禁止警告并暂时忽略它。我选择暂时只抑制烦人的警告(但确实计划将来从源代码构建)使用我们用于获取调试消息的相同日志记录选项购买,除了现在,只需将其设置为错误级别。
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR
我希望这能帮助其他人看到开源软件的一大好处是,如果你采取一些简单的逻辑步骤,你可以弄清楚这些东西。
我遇到了同样的问题。通过在.bashrc
中添加以下行来解决:
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
就我而言,在我在我的 64 位 Linux mint 操作系统上构建 hadoop之后,我在 hadoop/lib
中替换了本机库。问题仍然存在。然后我想出了指向hadoop/lib
而不是hadoop/lib/native
的哈多普.所以我只是将所有内容从本机库移动到其父库。警告刚刚消失。
这也行得通:
export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native
经过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 * ../
干杯
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"
对于通过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"
@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 :)
以为这可能会帮助遇到与我相同障碍的人
将编译的本机库文件移动到$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
文件夹中。
它应该有效。
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
这一行就在这里:
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
从KunBetter的回答来看,对我有用。只需将其附加到 .bashrc 文件并重新加载 .bashrc 内容即可
$ source ~/.bashrc
这一行就在这里:
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
从KunBetter的答案是钱在哪里
除了@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)中给出的高级步骤是正确的。在此 url 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 时的警告消息应该消失。
这个答案是@chromeeagle的分析与这个链接(南晓)的混合。
对于那些其他解决方案根本不起作用的人,请按照以下步骤操作:
-
编辑文件
$HADOOP_HOME/etc/hadoop/log4j.properties
(注明@chromeeagle)。在末尾添加该行:log4j.logger.org.apache.hadoop.util.NativeCodeLoader=DEBUG
-
启动你的火花/火花外壳。您将看到有关本机库未加载的其他日志信息。就我而言,我遇到了以下错误:
Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: no hadoop in java.library.path
-
要解决此特定问题,请将 Hadoop 本机库路径添加到用户配置文件中的
LD_LIBRARY_PATH
环境变量:export LD_LIBRARY_PATH="$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH"
希望这有帮助。我在几个HADOOP安装中遇到了这个问题,它适用于两者。
我在JDK6上遇到了同样的问题,我将JDK更改为JDK8,问题解决了。尝试使用 JDK8!!
我没有使用 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
将用户替换为您的用户名
基本上,这不是错误,而是Hadoop集群中的警告。这里我们只更新环境变量。
export HADOOP_OPTS = "$HADOOP_OPTS"-Djava.library.path =/usr/local/hadoop/lib
export HADOOP_COMMON_LIB_NATIVE_DIR = "/usr/local/hadoop/lib/native"
从早期帖子中验证的补救措施:
1)检查了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) 在hadoop-env.sh
HADOOP_OPT
中添加-Djava.library.path=<path>
:
export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -Djava.library.path=/opt/hadoop-2.6.0/lib/native"
这确实使烦人的警告消失了。
首先:您可以修改 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"
添加了 Hadoop 本机库以LD_LIBRARY_PATH .bashrc 文件,并使用源 ~/.bashrc 将库重新加载到当前会话中
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
(或者)如果你在/usr/lib/安装了 hadoop 库
export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native
本机 Hadoop库仅在 *nix 平台上受支持。该库不适用于Cygwin或Mac OS X平台。
参考: https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/NativeLibraries.html
如果您使用的是 Windows 或 Mac OS X,则需要将平台更改为 *nix。
对于安装Hadoop,从Cloudera安装免费版本要容易得多。它带有一个很好的GUI,使添加节点变得简单,没有编译或填充依赖项,它带有诸如hive,pig等东西。
http://www.cloudera.com/content/support/en/downloads.html
步骤是:1) 下载2)运行它3) 转到网页界面 (1.2.3.4:7180)4)在Web GUI中添加额外的节点(不要在其他节点上安装cloudera软件,它会为您完成所有工作)5) 在 Web GUI 中转到主页,单击色相和色相 Web UI。这使您可以访问Hive,Pig,Sqoop等。