Hadoop「プラットフォームのネイティブHadoopライブラリをロードできません」警告


269

私は、現在実行しているサーバー上でHadoopを設定していCentOSのを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

ただし、/native/hadoop 2.x のディレクトリの内容が異なるように見えるため、どうすればよいかわかりません。

また、これら2つの環境変数をに追加しましたhadoop-env.sh

エクスポートHADOOP_OPTS = "$ HADOOP_OPTS -Djava.library.path = / usr / local / hadoop / lib /"

エクスポートHADOOP_COMMON_LIB_NATIVE_DIR = "/ usr / local / hadoop / lib / native /"

何か案は?


3
検索可能性について:この問題は、少なくともHadoop 2.4.0、Hadoop 2.4.1、およびおそらく他のバージョンにも当てはまります。
Greg Dubicki

ネイティブライブラリの使用方法に関するドキュメントは、hadoop.apache.org / docs / current / hadoop
James Moore

回答:


227

64ビットCentOSでHadoopを実行していると思います。警告が表示された理由は、ネイティブのHadoopライブラリ$HADOOP_HOME/lib/native/libhadoop.so.1.0.0が実際には32ビットでコンパイルされているためです。

とにかく、これは単なる警告であり、Hadoopの機能には影響しません。

この警告を取り除きたい場合は、Hadoopのソースコードをダウンロードlibhadoop.so.1.0.0して64ビットシステムで再コンパイルし、32ビットシステムを置き換えます。

Ubuntuのソースコードを再コンパイルする手順は、次のとおりです。

幸運を。


7
うまくいきません。あなたのプラットフォームエラーのためにネイティブのhadoopライブラリをロードできないのと同じです。
Akshay Hazari 2014年

7
これが正確に機能しない場合でも、役に立ちます。では、これはパフォーマンスに影響を与えるのでしょうか?
WattsInABox 2014

1
Centos 7とCentos 6.5で同じhadoop 2.5.0 tarを使用しています。どちらも64ビットOSです。Centos7にはそのような警告はありませんが、Centos 6.5は私にこの警告を出します、なぜですか?
sandip divekar

ありがとう。警告だとは知らなかった。実際には「starting namenode」と言い、最後の文は「native-hadoopをロードできません...」であり、恐怖を引き起こしました。
Kaushik Lele 2015

-あなたが実際に命令が示唆として、全体のHadoopをコンパイルする必要はありませんhadoop-common-project/hadoop-commonし、hadoop-hdfs-project/hadoop-hdfs十分です。
Greg Dubicki

152

次のように、ネイティブに単語を追加してくださいHADOOP_OPTS

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

PS:Seareneに感謝


これも私のために行いました。UbuntuでHadoop 2.6を使用する場合、パスは/home/user/hadoop-2.6.0/lib/native
でした

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

1
2つの解決策は同じだと思います。docによると、java.library.pathはライブラリをロードするときに検索するパスのリストです。そのため、LD_LIBRARY_PATHをエクスポートするか、Javaコマンドラインで-Dオプションを使用できます。Javaコマンドラインで、-D <property> = valueを使用すると、システムプロパティ値を設定できます。
Hoai-Thu Vuong

54

答えは次のとおりです... 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

OSを2.14にアップデートできません。唯一の解決策は、私のOS上のソースからネイティブライブラリをビルドするか、警告を抑制して今のところ無視することです。私は今のところ、迷惑な警告を抑制することを選択しました(ただし、将来ソースからビルドする予定です)、デバッグメッセージを取得するために使用したのと同じロギングオプションを使用して購入します。

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

オープンソースソフトウェアの大きな利点は、いくつかの簡単な論理的な手順を踏めば、このことを理解できるということを他の人が理解できるようになることを願っています。


4
この美しく詳細な回答をありがとうございます。私は私の答えを得て、その過程で価値のあるもの(いくつかのこと)を学びました。
dogwynn

26

同じ問題がありました。次の行を追加することで解決します.bashrc

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

5
HADOOP_OPTS値に「/ native」を追加する必要がありました
Ala 'Alnajjar

21

私の場合、64ビットLinuxミントOSでhadoopをビルドした後、のネイティブライブラリを置き換えましたhadoop/lib。それでも問題は解決しません。それから私は、Hadoopがを指さhadoop/libないことを理解しましたhadoop/lib/native。したがって、すべてのコンテンツをネイティブライブラリからその親に移動しました。そして警告は消えた。


私はたまたまネット上のすべてを試しました。私は疲れて、libフォルダー自体のすべてのファイル、つまり上記の回答で提供されたリンクを使用してコンパイルされたファイルを空にしました。最後に、ダウン投票にもかかわらずなぜあなたがあなたの提案を試したのかわからないのですが、私はこのすべての背後にある1日を費やした途方もない戦いの後にうまくいきました。.bashrcのネイティブライブラリの場所を変更したかどうかは関係ありませんでしたまたはhadoop-env.sh。トンありがとう。
Akshay Hazari 2014年

私は疲れて、libフォルダー自体のすべてのネイティブフォルダーファイル、つまり上記の回答で提供されたリンクを使用してコンパイルされたファイル(新しいhadoop-2.4.0-src.tar.gzのネイティブフォルダー)を空にしました
Akshay Hazari

15

これも機能します:

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

1
ありがとう。tomcat aprを使用するためにLD_LIBRARY_PATHをオーバーライドする場合は、hadoopネイティブパスを `export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:/ usr / lib / hadoop / lib / nativeとして追加します。
Eric

これは私にとってはソリューションとしてのみ機能します。(他のすべての答えを試しました)。
sailfish009

13

コティが提案した継続的な調査の後、私は問題を解決しました。

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

乾杯


11

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"

フィリップに感謝します。このソリューションは完璧に機能しました。私の場合、必要なのはDjava.library.pathオプションだけでした。それがまさに私が探していたものです。ありがとう!!!
arcee123 2016年

どうもありがとうございます。bzip2:false、openssl:falseビルドはopensslをサポートしていません。他の人は道を示しています。助言がありますか。
ggorantl 2017年

11
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"

8

@zhutoulala-あなたのリンクがHadoop 2.4.0でうまく機能したFWIW。2.4.0の最初のリンクでパッチを使用したところ、問題なく動作しました。これが私が発行しなければならないMavenコマンドです

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

これをビルドしてライブラリを移動したら、hadoop-env.shを更新することを忘れないでください:)

これは私と同じ障害に遭遇した人を助けるかもしれないと思った


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フォルダーにあることを確認します。

うまくいくはずです。


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

はい、hadoopリソースを介して64ビットlib / nativeを再コンパイルする必要があります。
KunBetter 2014

2

この行はここにあります:

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とそれは私のために働いた。
ParagFlume 2016

1

この行はここにあります:

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
borice

1

JDK6でも同じ問題が発生しました。JDKをJDK8に変更しました。問題は解決しました。JDK8を使用してみてください!!!


1

@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ファイルのパッチ方法を変更する必要があります。さらに、パッチを適用するファイルは同じではありません。残念ながら、2.8に固有のJIRAの承認済みパッチはありません。このURL(https://issues.apache.org/jira/browse/HADOOP-9320)で、Andreas Muttschellerが提案するパッチをnamenodeにコピーして貼り付ける必要があります。

    :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実行時の警告メッセージが消えるはずです。


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内で、ホームに移動し、HueおよびHue Web UIをクリックします。これにより、Hive、Pig、Sqoopなどにアクセスできます。


Clouderaディストリビューションは、多くのパッケージで利用可能な現在のバージョンよりもずっと遅れています。あなたは「最新かつ最高の」したい場合は、Apache Hadoopのは、移動するための方法である
Nerrve

0

以前の投稿から確認された救済策:

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_OPThadoop-env.sh

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

これは確かに迷惑な警告を消した。


0

まず、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"

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で1回限りの設定で以下を実行しました。これにより、start-dfs.shを実行するときにパスワードを何度も入力する必要がなくなります。

sudo apt install openssh-server openssh-client
ssh-keygen -t rsa
ssh-copy-id user@localhost

ユーザーをユーザー名に置き換えます


0

基本的に、これはエラーではなく、Hadoopクラスターの警告です。ここでは、環境変数を更新します。

エクスポートHADOOP_OPTS = "$ HADOOP_OPTS" -Djava.library.path = / usr / local / hadoop / lib
 エクスポートHADOOP_COMMON_LIB_NATIVE_DIR = "/ usr / local / hadoop / lib / native"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.