Hadoop «Impossible de charger la bibliothèque native-hadoop pour votre plate-forme»

269

Je configure actuellement hadoop sur un serveur exécutant CentOs . Lorsque j'exécute start-dfs.shou stop-dfs.sh, j'obtiens l'erreur suivante:

WARN util.NativeCodeLoader: impossible de charger la bibliothèque native-hadoop pour votre plate-forme ... à l'aide des classes Java intégrées le cas échéant

J'utilise Hadoop 2.2.0.

Faire une recherche en ligne a fait apparaître ce lien: http://balanceandbreath.blogspot.ca/2013/01/utilnativecodeloader-unable-to-load.html

Cependant, le contenu de /native/ répertoire sur hadoop 2.x semble différent, donc je ne sais pas quoi faire.

J'ai également ajouté ces deux variables d'environnement dans hadoop-env.sh:

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

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

Des idées?

Olshansk
la source
3
Pour la recherche: ce problème s'applique également au moins à Hadoop 2.4.0, Hadoop 2.4.1 et probablement à d'autres versions.
Greg Dubicki
La documentation sur l'utilisation des bibliothèques natives est disponible sur hadoop.apache.org/docs/current/hadoop-project-dist/…
James Moore

Réponses:

227

Je suppose que vous utilisez Hadoop sur 64 bits CentOS. La raison pour laquelle vous avez vu cet avertissement est la bibliothèque native Hadoop$HADOOP_HOME/lib/native/libhadoop.so.1.0.0 été compilée en 32 bits.

Quoi qu'il en soit, ce n'est qu'un avertissement et n'affectera pas les fonctionnalités de Hadoop.

Voici comment supprimer cet avertissement, téléchargez le code source de Hadoop et recompilez libhadoop.so.1.0.0 sur un système 64 bits, puis remplacez celui 32 bits.

Les étapes sur la façon de recompiler le code source sont incluses ici pour Ubuntu:

Bonne chance.

zhutoulala
la source
7
Ça ne marche pas pour moi. Me donne le même Impossible de charger la bibliothèque native-hadoop pour votre erreur de plate-forme.
Akshay Hazari
7
Même si cela ne fonctionne pas exactement, c'est toujours utile. Cela aura-t-il un impact sur les performances?
WattsInABox
1
J'utilise le même tar hadoop 2.5.0 sur Centos 7 et Centos 6.5. Les deux sont OS 64 bits. Il n'y a pas un tel avertissement sur Centos7 mais Centos 6.5 me donne cet avertissement, pourquoi?
sandip divekar
Merci. Je ne savais pas que c'était un avertissement. Dit en fait "démarrage du namenode" et la dernière phrase est "Impossible de charger native-hadoop .." ce qui a provoqué la peur.
Kaushik Lele
Notez que vous n'avez pas besoin de compiler Hadoop entier, comme le suggèrent les instructions - hadoop-common-project/hadoop-commonet cela hadoop-hdfs-project/hadoop-hdfssuffit.
Greg Dubicki
152

Ajoutez simplement le mot natif à votre HADOOP_OPTScomme ceci:

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

PS: Merci Searene

Hoai-Thu Vuong
la source
Cela l'a fait pour moi aussi. Sur Ubuntu avec Hadoop 2.6, le chemin était /home/user/hadoop-2.6.0/lib/native
pelazem
25
export HADOOP_OPTS = "- Djava.library.path = $ HADOOP_HOME / lib / native"
Searene
1
Je pense que deux solutions sont les mêmes. Selon doc , java.library.path est une liste de chemins à rechercher lors du chargement des bibliothèques. Ainsi, vous pouvez exporter LD_LIBRARY_PATH ou utiliser l' option -D dans la ligne de commande java. En ligne de commande java, et -D <propriété> = valeur nous permettent de définir une valeur de propriété système.
Hoai-Thu Vuong
54

La réponse dépend ... Je viens d'installer Hadoop 2.6 depuis tarball sur CentOS 6.6 64 bits. L'installation Hadoop était en effet livrée avec une bibliothèque native 64 bits précompilée. Pour mon installation, c'est ici:

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

Et je sais que c'est 64 bits:

[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)

Malheureusement, j'ai stupidement ignoré la réponse juste là, me regardant en face alors que je me concentrais sur "Est-ce que cette bibliothèque 32 pr 64 bits?":

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

Alors, leçon apprise. Quoi qu'il en soit, le reste m'a au moins conduit à pouvoir supprimer l'avertissement. J'ai donc continué et fait tout ce qui était recommandé dans les autres réponses pour fournir le chemin de la bibliothèque en utilisant la variable d'environnement HADOOP_OPTS en vain. J'ai donc regardé le code source. Le module qui génère l'erreur vous indique l'astuce ( 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

Alors, ici pour voir ce que ça fait:

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

Ah, il y a une journalisation au niveau du débogage - Allumons cela pour voir si nous obtenons une aide supplémentaire. Pour ce faire, ajoutez la ligne suivante au fichier $ HADOOP_CONF_DIR / log4j.properties:

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

Ensuite, j'ai exécuté une commande qui génère l'avertissement d'origine, comme stop-dfs.sh, et j'ai obtenu ce bonus:

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)

Et la réponse est révélée dans cet extrait du message de débogage (la même chose que la précédente commande ldd 'a essayé' de me dire:

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

Quelle version de GLIBC ai-je? Voici une astuce simple à découvrir:

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

Donc, je ne peux pas mettre à jour mon OS vers 2.14. La seule solution consiste à créer les bibliothèques natives à partir de sources sur mon système d'exploitation ou à supprimer l'avertissement et à l'ignorer pour l'instant. J'ai choisi de supprimer l'avertissement ennuyeux pour l'instant (mais je prévois de construire à partir de sources à l'avenir) acheter en utilisant les mêmes options de journalisation que nous avons utilisées pour obtenir le message de débogage, sauf maintenant, faites-le simplement au niveau ERREUR.

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

J'espère que cela aide les autres à voir qu'un grand avantage des logiciels open source est que vous pouvez comprendre ces choses si vous prenez quelques étapes logiques simples.

chromeeagle
la source
4
Merci monsieur pour cette réponse magnifiquement détaillée. J'ai obtenu ma réponse et j'ai appris quelque chose de précieux (quelques choses) au cours du processus.
dogwynn
26

J'ai eu le même problème. Il est résolu en ajoutant les lignes suivantes dans .bashrc:

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
Neeraj
la source
5
J'ai dû ajouter "/ native" à la valeur HADOOP_OPTS
Ala 'Alnajjar
21

Dans mon cas, après avoir construit hadoop sur mon système d'exploitation Linux 64 bits, j'ai remplacé la bibliothèque native dans hadoop/lib. Le problème persiste toujours. Ensuite, j'ai compris le hadoop pointant vers hadoop/libnon hadoop/lib/native. J'ai donc simplement déplacé tout le contenu de la bibliothèque native vers son parent. Et l'avertissement vient de disparaître.

koti
la source
Il se trouve que j'ai tout essayé sur le net. Je me suis fatigué et j'ai simplement vidé tous les fichiers dans le dossier lib lui-même, c'est-à-dire ceux compilés à l'aide des liens fournis dans la réponse ci-dessus. Enfin, je ne sais pas pourquoi malgré les votes négatifs que vous avez, j'ai essayé votre suggestion et cela a fonctionné après une lutte énorme que j'ai supportée pendant une journée derrière tout cela. ou hadoop-env.sh. Merci une tonne.
Akshay Hazari
Je me suis fatigué et j'ai simplement vidé tous les fichiers du dossier natif dans le dossier lib lui-même, c'est-à-dire ceux compilés à l'aide des liens fournis dans la réponse ci-dessus (dossier natif dans le nouveau hadoop-2.4.0-src.tar.gz.)
Akshay Hazari
15

Cela fonctionnerait également:

export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native
Kalyan Ghosh
la source
1
Merci. Si vous surchargez LD_LIBRARY_PATH pour utiliser tomcat apr, ajoutez simplement le chemin natif hadoop comme `export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: / usr / lib / hadoop / lib / native.
Eric
cela ne fonctionne que pour moi. (essayé toutes les autres réponses).
sailfish009
13

Après une recherche continue comme suggéré par Koti, j'ai résolu le problème.

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

À votre santé

Nagarjuna DN
la source
11

Pour ceux sur OSX avec Hadoop installé via Homebrew, suivez ces étapes en remplaçant le chemin et la version Hadoop le cas échéant

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/

puis mettez à jour hadoop-env.sh avec

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"
Philip O'Brien
la source
Merci Philippe. Cette solution a parfaitement fonctionné. Dans mon cas, tout ce dont j'avais besoin était l'option Djava.library.path. C'était exactement ce que je cherchais. Merci!!!
arcee123
Merci beaucoup. J'ai bzip2: false, openssl: false build ne prend pas en charge openssl. Les autres ont le chemin qui apparaît. Aucune suggestion.
ggorantl
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"
li li
la source
8

@zhutoulala - FWIW vos liens ont fonctionné pour moi avec Hadoop 2.4.0 à une exception près, j'ai dû dire à maven de ne pas construire les javadocs. J'ai également utilisé le correctif dans le premier lien pour 2.4.0 et cela a bien fonctionné. Voici la commande maven que j'ai dû émettre

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

Après avoir construit cela et déplacé les bibliothèques, n'oubliez pas de mettre à jour hadoop-env.sh :)

J'ai pensé que cela pourrait aider quelqu'un qui s'est heurté aux mêmes barrages routiers que moi

user2229544
la source
5

Déplacez vos fichiers de bibliothèque natifs compilés vers un $HADOOP_HOME/libdossier.

Ensuite, définissez vos variables d'environnement en modifiant le .bashrcfichier

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

Assurez-vous que vos fichiers de bibliothèque natifs compilés se trouvent dans le $HADOOP_HOME/libdossier.

ça devrait marcher.

Vijayakumar
la source
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
KunBetter
la source
oui, vous devriez avoir recompilé la lib / native 64 bits via la ressource hadoop.
KunBetter
2

Cette ligne ici:

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

D'après la réponse de KunBetter, cela a fonctionné pour moi. Il suffit de l'ajouter au fichier .bashrc et de recharger le contenu .bashrc

$ source ~/.bashrc
BeingSachin
la source
J'utilise la version hadoop-2.6.0 dans mon système local. J'étais également confronté au même problème. Ensuite, j'ai téléchargé le hadoop-2.7.1-src et construit des bibliothèques binaires et natives, j'ai également remplacé les bibliothèques natives hadoop-2.6.0 par les nouvelles natives. Mais je recevais toujours les mêmes erreurs. Ensuite, moi export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATHet cela a fonctionné pour moi.
ParagFlume
1

Cette ligne ici:

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

D'après la réponse de KunBetter, où est l'argent

Tom Kelly
la source
Dans mon cas, j'avais besoin des deux: export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH et export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH
borice
1

J'ai eu le même problème avec JDK6, j'ai changé le JDK en JDK8, le problème a été résolu. Essayez d'utiliser JDK8 !!!

MangoJo
la source
1

En plus de la réponse acceptée par @zhutoulala, voici une mise à jour pour la faire fonctionner avec la dernière version stable à ce jour (2.8) sur les plateformes ARMHF (Raspberry Pi 3 modèle B). Je peux d'abord confirmer que vous devez recompiler les bibliothèques natives en ARM 64 bits, les autres réponses ici basées sur la définition de certaines variables d'environnement ne fonctionneront pas. Comme indiqué dans la documentation Hadoop, les bibliothèques natives préconstruites sont en 32 bits.

Les étapes de haut niveau indiquées dans le premier lien ( http://www.ercoppa.org/posts/how-to-compile-apache-hadoop-on-ubuntu-linux.html ) sont correctes. Sur cette URL http://www.instructables.com/id/Native-Hadoop-260-Build-on-Pi/ vous obtenez plus de détails spécifiques à Raspberry Pi, mais pas pour Hadoop version 2.8.

Voici mes indications pour Hadoop 2.8:

  • il n'y a toujours pas de package protobuf sur le dernier Raspbian, vous devez donc le compiler vous-même et la version doit être exactement protobuf 2.5 ( https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz )
  • La méthode de correction des fichiers CMake doit être modifiée. De plus, les fichiers à patcher ne sont pas les mêmes. Malheureusement, il n'y a pas de correctif accepté sur JIRA spécifique à 2.8. Sur cette URL ( https://issues.apache.org/jira/browse/HADOOP-9320 ), vous devez copier et coller le patch proposé par Andreas Muttscheller sur votre 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

Une fois la construction réussie:

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

Et remplacez le contenu du répertoire lib / native de votre installation Hadoop par le contenu de cette archive. Le message d'avertissement lors de l'exécution de Hadoop devrait disparaître.

mattt
la source
0

Pour installer Hadoop, il est tellement plus facile d'installer la version gratuite de Cloudera. Il est livré avec une belle interface graphique qui facilite l'ajout de nœuds, il n'y a pas de compilation ou de bourrage de dépendances, il est livré avec des trucs comme ruche, cochon, etc.

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

Les étapes sont les suivantes: 1) Téléchargez 2) Exécutez-le 3) Accédez à l'interface graphique Web (1.2.3.4:7180) 4) Ajoutez des nœuds supplémentaires dans l'interface graphique Web (n'installez PAS le logiciel cloudera sur d'autres nœuds, il le fait tout pour vous) 5) Dans l'interface graphique Web, accédez à Accueil, cliquez sur Hue and Hue Web UI. Cela vous donne accès à Hive, Pig, Sqoop etc.

MikeKulls
la source
Les distributions Cloudera accusent un retard important par rapport aux versions actuelles disponibles pour de nombreux packages. si vous voulez "le plus récent et le plus grand", Apache Hadoop est la voie à suivre
Nerrve
0

Solution vérifiée à partir de publications antérieures:

1) Vérifié que la libhadoop.so.1.0.0livraison avec la distribution Hadoop a été compilée pour l'architecture de ma machine, qui est 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) Ajouté -Djava.library.path=<path>à HADOOP_OPTen hadoop-env.sh:

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

Cela a en effet fait disparaître l'avertissement ennuyeux.

piiteraq
la source
0

Premièrement: vous pouvez modifier la version de la glibc. CentOS fournit des logiciels sûrs de manière classique, cela signifie également que la version est ancienne comme glibc, protobuf ...

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

Vous pouvez comparer la version de la glibc actuelle avec la glibc nécessaire.

Deuxièmement: si la version de la glibc actuelle est ancienne, vous pouvez mettre à jour la glibc. DownLoad Glibc

Si la version de l'identifiant de la glibc actuelle est correcte, vous pouvez ajouter un mot natif à votre HADOOP_OPTS

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

Je n'utilise pas CentOS. Voici ce que j'ai dans Ubuntu 16.04.2, hadoop-2.7.3, jdk1.8.0_121. Exécutez start-dfs.sh ou stop-dfs.sh avec succès sans erreur:

# 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

Remplacez / j01 / sys / jdk, / j01 / srv / hadoop par votre chemin d'installation

J'ai également fait ce qui suit pour une configuration unique sur Ubuntu, ce qui élimine la nécessité de saisir des mots de passe plusieurs fois lors de l'exécution de start-dfs.sh:

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

Remplacez l'utilisateur par votre nom d'utilisateur

Jonathan L
la source
0

Fondamentalement, ce n'est pas une erreur, c'est un avertissement dans le cluster Hadoop. Ici, nous mettons à jour les variables d'environnement.

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