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?
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.
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
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:
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.
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"
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.
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
Das würde auch funktionieren:
export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native
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"
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"
@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
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.
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
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
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:
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.
Ich hatte das gleiche Problem mit JDK6, ich habe das JDK in JDK8 geändert, das Problem wurde behoben. Versuche JDK8 zu benutzen !!!
Diese Zeile hier:
export Java_LIBRARY_PATH=$HADOOP_HOME/lib/native:$Java_LIBRARY_PATH
Aus KunBetters Antwort geht hervor, wo das Geld ist
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"
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.
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
Ü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.