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

时间:2013-11-13 01:53:25

标签: java linux hadoop hadoop2 nativelibrary

我正在运行 CentOs 的服务器上配置hadoop。当我运行start-dfs.shstop-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上的/native/目录的内容似乎不同,所以我不知道该怎么做。

我还在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 /”

任何想法?

23 个答案:

答案 0 :(得分:210)

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

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

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

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

祝你好运。

答案 1 :(得分:133)

只需将 native 添加到您的HADOOP_OPTS,就像这样:

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

PS:感谢Searene

答案 2 :(得分:48)

答案取决于......我刚从64位CentOS 6.6上的tarball安装了Hadoop 2.6。 Hadoop安装确实带有预构建的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)

我知道它是64位的:

`GLIBC_2.14' not found (required by ./libhadoop.so.1.0.0)

不幸的是,我愚蠢地忽略了那里的答案,正如我所关注的那样盯着我的脸,"这个图书馆是32位64位吗?":

15/06/18 18:59:23 WARN util.NativeCodeLoader: Unable to load native-hadoop    library for your platform... using builtin-java classes where applicable

所以,经验教训。无论如何,其余的至少让我能够压制警告。所以我继续并在其他答案中做了所有建议,使用HADOOP_OPTS环境变量提供库路径无济于事。所以我查看了源代码。生成错误的模块会告诉您提示( util.NativeCodeLoader ):

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

所以,到这里来看看它的作用:

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文件来完成的:

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)

然后我运行了一个生成原始警告的命令,比如stop-dfs.sh,并得到了这个好东西:

`GLIBC_2.14' not found (required by opt/hadoop/lib/native/libhadoop.so.1.0.0)

答案显示在调试消息的这个片段中(与之前的ldd命令一样,尝试告诉我:

[hadoop@VMWHADTEST01 hadoop]$ ldd --version
ldd (GNU libc) 2.12

我有什么版本的GLIBC?这是一个简单的技巧:

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

因此,无法将我的操作系统更新为2.14。唯一的解决方案是从我的操作系统上的源构建本机库或抑制警告,暂时忽略它。我选择暂时禁止恼人的警告(但计划在将来从源代码构建)使用我们用于获取调试消息的相同日志记录选项购买,除了现在,只需将其设置为ERROR级别。

{{1}}

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

答案 3 :(得分:21)

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

答案 4 :(得分:21)

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

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

答案 5 :(得分:13)

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

干杯

答案 6 :(得分:10)

这也可行:

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

答案 7 :(得分:10)

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

答案 8 :(得分:8)

Sub Main()

Dim sh As Worksheet
Set sh = ActiveSheet

Dim rng As Range
Set rng = sh.Range("A6:D10")

Call Separate_English_Chinese(rng)

End Sub

Sub Separate_English_Chinese(rng)

Dim sh As Worksheet
Set sh = rng.Parent

Dim EnglishCharacters As String
Dim colEng As Long, colChn As Long, colContains As Long
Dim a As String, i As Long, k As Long
Dim colFullText As Long, txtEnglish As String, txtChinese As String
Dim Result As Long, Contains As String
Dim First As Long, Last As Long

First = rng.Row
Last = rng.Rows.Count + rng.Row - 1

EnglishCharacters = "qwertyuiopasdfghjklzxcvbnm"

EnglishCharacters = UCase(EnglishCharacters) & LCase(EnglishCharacters)

colFullText = 1
colEng = 2
colChn = 3
colContains = 4

For i = First To Last

    a = sh.Cells(i, colFullText).Value

    txtEnglish = ""
    txtChinese = ""

    For k = 1 To Len(a)

        If InStr(EnglishCharacters, Mid(a, k, 1)) Then
            txtEnglish = txtEnglish & Mid(a, k, 1)
        Else
            txtChinese = txtChinese & Mid(a, k, 1)
        End If

    Next

    sh.Cells(i, colEng).Value = txtEnglish
    sh.Cells(i, colChn).Value = txtChinese

    Result = 0
    If txtEnglish <> "" Then Result = Result + 1
    If txtChinese <> "" Then Result = Result + 10

    Select Case Result

        Case 1
        Contains = "ENG"
        Case 10
        Contains = "CHN"
        Case 11
        Contains = "BOTH"
        Case Else
        Contains = ""

    End Select

    sh.Cells(i, colContains).Value = Contains

Next

End Sub

答案 9 :(得分:8)

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

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

答案 10 :(得分:5)

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

它应该有用。

答案 11 :(得分:2)

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

答案 12 :(得分:2)

这一行就在这里:

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

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

即可
$ source ~/.bashrc

答案 13 :(得分:1)

除了@zhutoulala接受的答案之外,这里还有一个更新,使其适用于ARMHF平台上最新的稳定版本(2.8)(Raspberry Pi 3型号B)。 首先,我可以确认您必须将本机库重新编译为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时的警告消息应该消失。

答案 14 :(得分:1)

我遇到了与JDK6相同的问题,我将JDK改为JDK8,问题解决了。 尝试使用JDK8 !!!

答案 15 :(得分:1)

这一行就在这里:

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

来自KunBetter的回答是资金来源

答案 16 :(得分: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。

答案 17 :(得分:0)

这个答案是 @chromeeagle's analysisthis link (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 安装中遇到了这个问题,它对两个都有效。

答案 18 :(得分:0)

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

export HADOOP_OPTS = "$HADOOP_OPTS"-Djava.library.path = /usr/local/hadoop/lib
 export HADOOP_COMMON_LIB_NATIVE_DIR = "/usr/local/hadoop/lib/native"

答案 19 :(得分:0)

以前发布的帖子验证了补救措施:

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)在-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"

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

答案 20 :(得分:0)

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

将用户替换为您的用户名

答案 21 :(得分:0)

首先:你可以修改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"

答案 22 :(得分:0)

为了安装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等。