wake-up-neo.net

Hadoop Warnung "Native-Hadoop-Bibliothek für Ihre Plattform kann nicht geladen werden"

Ich konfiguriere derzeit Hadoop auf einem Server, auf dem CentOs ausgeführt werden. Wenn ich start-dfs.sh oder stop-dfs.sh ausführe, wird folgende Fehlermeldung angezeigt:

WARN util.NativeCodeLoader: Die native-hadoop-Bibliothek für Ihre Plattform kann nicht geladen werden ... ggf. mit integrierten Java-Klassen

Ich laufe Hadoop 2.2.0.

Bei einer Online-Suche wurde dieser Link aufgerufen: http://balanceandbreath.blogspot.ca/2013/01/utilnativecodeloader-unable-to-load.html

Der Inhalt des Verzeichnisses /native/ auf hadoop 2.x scheint jedoch anders zu sein, sodass ich nicht sicher bin, was ich tun soll.

Ich habe diese beiden Umgebungsvariablen auch in hadoop-env.sh hinzugefügt:

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

export HADOOP_COMMON_LIB_NATIVE_DIR = "/ usr/local/hadoop/lib/native /"

Irgendwelche Ideen?

249
Olshansk

Ich gehe davon aus, dass Sie Hadoop auf 64-Bit-CentOS ausführen. Der Grund, warum Sie diese Warnung gesehen haben, ist die native Hadoop-Bibliothek $HADOOP_HOME/lib/native/libhadoop.so.1.0.0, die tatsächlich mit 32 Bit kompiliert wurde.

Wie auch immer, es ist nur eine Warnung und hat keinen Einfluss auf die Funktionen von Hadoop.

Wenn Sie diese Warnung beseitigen möchten, laden Sie den Quellcode von Hadoop herunter und kompilieren Sie libhadoop.so.1.0.0 auf einem 64-Bit-System neu. Ersetzen Sie dann den 32-Bit-Code.

Schritte zum Neukompilieren des Quellcodes finden Sie hier für Ubuntu:

Viel Glück.

213
zhutoulala

Fügen Sie einfach Word native zu Ihrem HADOOP_OPTS wie folgt hinzu:

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

PS: Danke Searene

139
Hoai-Thu Vuong

Die Antwort hängt davon ab ... Ich habe gerade Hadoop 2.6 von Tarball auf 64-Bit CentOS 6.6 installiert. Die Hadoop-Installation enthielt tatsächlich eine vorgefertigte native 64-Bit-Bibliothek. Für meine Installation ist es hier:

/opt/hadoop/lib/native/libhadoop.so.1.0.0

Und ich weiß, dass es 64-Bit ist:

[[email protected] 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)

Leider habe ich die Antwort dumm übersehen und mich direkt ins Gesicht gestarrt, als ich mich auf die Frage konzentrierte: "Ist diese Bibliothek 32 pr 64 bit?":

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

Lektion gelernt. Jedenfalls hat mich der Rest dazu gebracht, die Warnung unterdrücken zu können. Also fuhr ich fort und tat alles, was in den anderen Antworten empfohlen wurde, um den Bibliothekspfad ohne Erfolg mit der Umgebungsvariablen HADOOP_OPTS bereitzustellen. Also habe ich mir den Quellcode angesehen. Das Modul, das den Fehler generiert, gibt Ihnen den Hinweis ( 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

Also auf nach hier, um zu sehen, was es tut:

http://grepcode.com/file/repo1.maven.org/maven2/com.ning/metrics.action/0.2.6/org/Apache/hadoop/util/NativeCodeLoader.Java/

Ah, es gibt einige Debug-Level-Logs - lassen Sie uns das einschalten und sehen, ob wir zusätzliche Hilfe bekommen. Dazu fügen Sie der Datei $ HADOOP_CONF_DIR/log4j.properties die folgende Zeile hinzu:

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

Dann habe ich einen Befehl ausgeführt, der die ursprüngliche Warnung wie stop-dfs.sh generiert, und diesen Goodie erhalten:

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)

Und die Antwort wird in diesem Snippet der Debug-Nachricht enthüllt (dasselbe, was der vorherige ldd-Befehl versucht hat, mir mitzuteilen:

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

Welche Version von GLIBC habe ich? Hier ist ein einfacher Trick, um herauszufinden:

[[email protected] hadoop]$ ldd --version
ldd (GNU libc) 2.12

Ich kann mein Betriebssystem nicht auf 2.14 aktualisieren. Die einzige Lösung besteht darin, die nativen Bibliotheken aus Quellen auf meinem Betriebssystem zu erstellen oder die Warnung zu unterdrücken und sie vorerst einfach zu ignorieren. Ich habe mich entschieden, nur die nervige Warnung für den Moment zu unterdrücken (aber in Zukunft aus Quellen zu bauen). Ich kaufe mit den gleichen Protokollierungsoptionen, die wir verwendet haben, um die Debug-Meldung zu erhalten, außer jetzt, mache es einfach zu einem FEHLER.

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

Ich hoffe, dies hilft anderen zu erkennen, dass ein großer Vorteil von Open Source-Software darin besteht, dass Sie dieses Zeug herausfinden können, wenn Sie einige einfache logische Schritte unternehmen.

49
chromeeagle

Ich hatte das gleiche Problem. Es wird gelöst, indem folgende Zeilen in .bashrc hinzugefügt werden:

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

In meinem Fall habe ich die native Bibliothek in hadoop/lib ersetzt, nachdem ich Hadoop auf meinem 64-Bit-Linux-Minze-Betriebssystem erstellt habe. Trotzdem bleibt das Problem bestehen. Dann fand ich heraus, dass der Hadoop auf hadoop/lib und nicht auf hadoop/lib/native zeigte. Also habe ich einfach den gesamten Inhalt aus der nativen Bibliothek in die übergeordnete Bibliothek verschoben. Und die Warnung ist einfach weg.

21
koti

Nach einer kontinuierlichen Recherche, wie von Koti vorgeschlagen, wurde das Problem behoben.

[email protected]:~$ cd /usr/local/hadoop

[email protected]:/usr/local/hadoop$ ls

bin  include  libexec      logs        README.txt  share
etc  lib      LICENSE.txt  NOTICE.txt  sbin

[email protected]:/usr/local/hadoop$ cd lib

[email protected]:/usr/local/hadoop/lib$ ls
native

[email protected]:/usr/local/hadoop/lib$ cd native/

[email protected]:/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

[email protected]:/usr/local/hadoop/lib/native$ Sudo mv * ../

Prost

13
Nagarjuna D N

Das würde auch funktionieren:

export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native
11
Kalyan Ghosh

Befolgen Sie für OSX-Benutzer, bei denen Hadoop über Homebrew installiert ist, die folgenden Schritte, um den Pfad und die Hadoop-Version zu ersetzen

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/

dann aktualisiere hadoop-env.sh mit

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
Philip O'Brien
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
li li

@zhutoulala - FWIW Ihre Links funktionierten für mich mit Hadoop 2.4.0, mit einer Ausnahme musste ich maven sagen, dass sie die Javadocs nicht erstellen sollen. Ich habe auch den Patch im ersten Link für 2.4.0 verwendet und es hat gut funktioniert. Hier ist der Maven-Befehl, den ich ausgeben musste

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

Vergessen Sie nach dem Erstellen und Verschieben der Bibliotheken nicht, hadoop-env.sh zu aktualisieren :)

Dachte, das könnte jemandem helfen, der auf die gleichen Straßensperren stößt wie ich

8
user2229544

Verschieben Sie Ihre kompilierten nativen Bibliotheksdateien in den Ordner $HADOOP_HOME/lib.

Stellen Sie dann Ihre Umgebungsvariablen ein, indem Sie die Datei .bashrc bearbeiten

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

Stellen Sie sicher, dass sich Ihre kompilierten nativen Bibliotheksdateien im Ordner $HADOOP_HOME/lib befinden.

es sollte funktionieren.

5
Vijayakumar

Diese Zeile hier:

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

Aus KunBetters Antwort, arbeitete für mich. Hänge es einfach an die .bashrc-Datei an und lade den .bashrc-Inhalt neu

$ source ~/.bashrc
2
BeingSachin
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
2
KunBetter

Zusätzlich zu der von @zhutoulala akzeptierten Antwort gibt es hier ein Update, damit es mit der aktuellsten stabilen Version (2.8) auf ARMHF-Plattformen (Raspberry Pi 3 Modell B) funktioniert. Zuerst kann ich bestätigen, dass Sie native Bibliotheken auf 64-Bit-ARM neu kompilieren müssen. Andere Antworten, die hier auf dem Festlegen einiger Umgebungsvariablen basieren, funktionieren nicht. Wie in der Hadoop-Dokumentation angegeben, handelt es sich bei den vorgefertigten nativen Bibliotheken um 32-Bit-Bibliotheken.

Die im ersten Link angegebenen allgemeinen Schritte ( http://www.ercoppa.org/posts/how-to-compile-Apache-hadoop-on-ubuntu-linux.html ) sind korrekt. In dieser URL http://www.instructables.com/id/Native-Hadoop-260-Build-on-Pi/ erhalten Sie nähere Informationen zu Raspberry Pi, jedoch nicht zu Hadoop Version 2.8.

Hier sind meine Indikationen für Hadoop 2.8:

  • auf dem neuesten Raspbian gibt es noch kein Protobuf-Paket. Sie müssen es also selbst kompilieren und die Version muss exakt Protobuf 2.5 sein ( https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz =)
  • Die Patch-Methode für CMake-Dateien muss geändert werden. Außerdem sind die zu patchenden Dateien nicht gleich. Leider gibt es keinen akzeptierten Patch für JIRA 2.8. Auf dieser URL ( https://issues.Apache.org/jira/browse/HADOOP-932 ) müssen Sie den von Andreas Muttscheller vorgeschlagenen Patch kopieren und in Ihren Namensknoten einfügen:

    :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
    

Sobald der Build erfolgreich ist:

    :hadoop-2.8.0-src/hadoop-dist/target/hadoop-2.8.0/lib/native $ tar -cvf nativelibs.tar *

Und ersetzen Sie den Inhalt des lib/native-Verzeichnisses Ihrer Hadoop-Installation durch den Inhalt dieses Archivs. Die Warnmeldung beim Ausführen von Hadoop sollte verschwinden.

1
mattt

Ich hatte das gleiche Problem mit JDK6, ich habe das JDK in JDK8 geändert, das Problem wurde behoben. Versuche JDK8 zu benutzen !!!

1
MangoJo

Diese Zeile hier:

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

Aus KunBetters Antwort geht hervor, wo das Geld ist

1
Tom Kelly

Erstens: Sie können die glibc-Version modifizieren. CentOS stellt tranditional sichere Software bereit. Dies bedeutet auch, dass die Version alt ist, wie z. B. glibc, protobuf ...

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

Sie können die aktuelle Version von glibc mit der benötigten Version von glibc vergleichen.

Zweitens: Wenn die Version der aktuellen Glibc alt ist, können Sie die Glibc aktualisieren. DownLoad Glibc

Wenn die Version der aktuellen Glibc-ID richtig ist, können Sie Word nativ an Ihre HADOOP_OPTS anhängen

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

Für die Installation von Hadoop ist es soooooo viel einfacher, die kostenlose Version von Cloudera zu installieren. Es kommt mit einer netten GUI, die es einfach macht, Knoten hinzuzufügen, es gibt kein Kompilieren oder Herumstöbern mit Abhängigkeiten, es kommt mit Sachen wie Hive, Schwein usw.

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

Schritte sind: 1) Herunterladen 2) Ausführen 3) Zum Web-GUI (1.2.3.4:7180) 4) Hinzufügen zusätzlicher Knoten in der Web-GUI (Installieren Sie die Cloudera-Software NICHT auf anderen Knoten, sie erledigt alles für Sie) 5) Klicken Sie in der Web-GUI auf Startseite auf Farbton und Farbton-Web-Benutzeroberfläche. Dies gibt Ihnen Zugriff auf Hive, Pig, Sqoop usw.

0
MikeKulls

Ich benutze CentOS nicht. Folgendes habe ich in Ubuntu 16.04.2, hadoop-2.7.3, jdk1.8.0_121. Führen Sie start-dfs.sh oder stop-dfs.sh erfolgreich ohne Fehler aus:

# 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

Ersetzen Sie/j01/sys/jdk,/j01/srv/hadoop durch Ihren Installationspfad

Ich habe auch folgendes einmaliges Setup unter Ubuntu durchgeführt, wodurch die Notwendigkeit entfällt, Passwörter mehrmals einzugeben, wenn start-dfs.sh ausgeführt wird:

Sudo apt install openssh-server openssh-client
ssh-keygen -t rsa
ssh-copy-id [email protected]

Ersetzen Sie den Benutzer durch Ihren Benutzernamen

0
Jonathan L

Überprüfte Abhilfe aus früheren Beiträgen:

1) Überprüft, ob der mit der Hadoop-Distribution gelieferte libhadoop.so.1.0.0 für meine Rechnerarchitektur (x86_64) kompiliert wurde:

[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> zu HADOOP_OPT in hadoop-env.sh hinzugefügt:

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

Dies ließ die ärgerliche Warnung in der Tat verschwinden.

0
piiteraq