【问题标题】:Hadoop "Unable to load native-hadoop library for your platform" warningHadoop“无法为您的平台加载本机 hadoop 库”警告
【发布时间】:2013-11-25 11:06:54
【问题描述】:

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

WARN util.NativeCodeLoader: 无法加载 native-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/"

有什么想法吗?

【问题讨论】:

标签: java linux hadoop hadoop2 java.library.path


【解决方案1】:

这个答案是@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 安装中遇到了这个问题,它在两者上都有效。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        祝你好运。

        【讨论】:

        • 对我不起作用。给我同样的 Unable to load native-hadoop library for your platform 错误。
        • 即使这并不完全有效,它仍然很有帮助。那么这会影响性能吗?
        • 我在 Centos 7 和 Centos 6.5 上使用相同的 hadoop 2.5.0 tar。两者都是 64 位操作系统。 Centos7 上没有这样的警告,但是 Centos 6.5 给了我这个警告,为什么?
        • 谢谢。我没有意识到这是一个警告。实际上说“启动namenode”,最后一句是“无法加载native-hadoop ..”,这引起了恐惧。
        • 请注意,您实际上不必按照说明的建议编译整个 Hadoop - hadoop-common-project/hadoop-commonhadoop-hdfs-project/hadoop-hdfs 就足够了。
        【解决方案5】:
        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"
        

        【讨论】:

          【解决方案6】:

          只需将单词 native 附加到您的 HADOOP_OPTS,如下所示:

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

          PS:谢谢Searene

          【讨论】:

          • 这也为我做了。在带有 Hadoop 2.6 的 Ubuntu 上,路径是 /home/user/hadoop-2.6.0/lib/native
          • export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
          • 我认为,两种解决方案是相同的。根据docjava.library.path 是加载库时要搜索的路径列表。因此,您可以在 java 命令行中导出 LD_LIBRARY_PATH 或使用 -D 选项。在 java 命令行中,-D=value 允许我们设置系统属性值。
          • 这对我来说是正确的解决方案。它修复了警告
          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

            用你的用户名替换用户

            【讨论】:

              【解决方案9】:

              根据 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 * ../
              

              干杯

              【讨论】:

                【解决方案10】:

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

                【讨论】:

                • 我只是碰巧尝试了网上的一切。我累了,只是清空了 lib 文件夹本身中的所有文件,即使用上述答案中提供的链接编译的文件。最后,我不知道为什么尽管你得到了反对意见,但我还是尝试了你的建议,并且在我为这一切付出了一天的巨大努力之后,它奏效了。我是否更改了 .bashrc 中的本机库位置并不重要或 hadoop-env.sh。非常感谢。
                • 我累了,只是清空了 lib 文件夹本身中的所有本机文件夹文件,即使用上述答案中提供的链接编译的文件(新 hadoop-2.4.0-src 中的本机文件夹。 tar.gz.)
                【解决方案11】:

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

                【讨论】:

                  【解决方案12】:

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

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

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

                  其次:如果当前glibc版本老了,可以更新glibc。 DownLoad Glibc

                  如果当前 glibc id 的版本是正确的,你可以在你的 HADOOP_OPTS 中附加单词 native

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

                  【讨论】:

                    【解决方案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"
                    

                    【讨论】:

                    • 谢谢菲利普。这个解决方案很完美。就我而言,我只需要选项 Djava.library.path。这正是我想要的。谢谢!!!
                    • 非常感谢。我有 bzip2: false , openssl: false 构建不支持 openssl。其他人有路径出现。任何建议。
                    【解决方案14】:

                    这也可以:

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

                    【讨论】:

                    • 谢谢。如果您覆盖 LD_LIBRARY_PATH 以使用 tomcat apr,只需将 hadoop 本机路径附加为 `export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/hadoop/lib/native。
                    • 这仅对我有效。 (尝试了所有其他答案)。
                    【解决方案15】:

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

                    它应该可以工作。

                    【讨论】:

                      【解决方案16】:

                      这一行就在这里:

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

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

                      $ source ~/.bashrc
                      

                      【讨论】:

                      • 我在本地系统中使用 hadoop-2.6.0 版本。我也面临同样的问题。然后我下载了 hadoop-2.7.1-src 并构建了二进制库和本地库,还用新构建的本地库替换了本地库 hadoop-2.6.0。但我仍然遇到同样的错误。然后我export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH,它对我有用。
                      【解决方案17】:

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

                      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 中将-Djava.library.path=&lt;path&gt; 添加到HADOOP_OPT

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

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

                      【讨论】:

                        【解决方案18】:

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

                        这个调试消息的 sn-p 中揭示了答案(与之前的 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
                        

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

                        【讨论】:

                        • 谢谢您,先生这个精美详细的答案。我得到了答案,并在此过程中学到了一些有价值的东西(一些东西)。
                        【解决方案19】:

                        这一行就在这里:

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

                        来自KunBetter的答案是钱在哪里

                        【讨论】:

                        • 就我而言,我需要两个:export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATHexport LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH
                        【解决方案20】:
                        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
                        

                        【讨论】:

                        • 是的,你应该通过 hadoop 资源重新编译 64 位 lib/native。
                        【解决方案21】:

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

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

                        【讨论】:

                        • 我必须将“/native”添加到 HADOOP_OPTS 值
                        • 对我不起作用。在.zshrc 中添加/nativeHADOOP_OPTS 并采购它,没有骰子
                        【解决方案22】:

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

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

                        【讨论】:

                          【解决方案23】:

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

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

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

                          【讨论】:

                          • Cloudera 发行版比许多软件包可用的当前版本落后很多时间。如果您想要“最新最好的”,Apache Hadoop 是您的最佳选择
                          猜你喜欢
                          • 1970-01-01
                          • 2015-08-02
                          • 2013-09-10
                          • 2021-12-11
                          • 2016-04-30
                          • 2016-02-28
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多