web-dev-qa-db-fra.com

Avertissement Hadoop "Impossible de charger la bibliothèque native-hadoop pour votre plate-forme"

Je configure actuellement hadoop sur un serveur exécutant CentOs . Lorsque j'exécute start-dfs.sh ou stop-dfs.sh, le message d'erreur suivant s'affiche:

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

Je cours 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 du répertoire /native/ sur hadoop 2.x semble être différent et je ne sais pas trop 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?

249
Olshansk

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

Quoi qu'il en soit, ce n'est qu'un avertissement et n'aura aucune incidence sur les fonctionnalités de Hadoop.

Si vous souhaitez éliminer 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 le code 32 bits.

Les étapes sur la recompilation du code source sont incluses ici pour Ubuntu:

Bonne chance.

213
zhutoulala

Il suffit d’ajouter Word natif à votre HADOOP_OPTS comme ceci:

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

PS: Merci Searene

139
Hoai-Thu Vuong

La réponse dépend… Je viens d'installer Hadoop 2.6 à partir de tarball sur CentOS 6.6 64 bits. L’installation de Hadoop est en effet venue avec une bibliothèque native 64 bits prédéfinie. Pour mon installation, c'est ici:

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

Et je sais qu'il est en 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 bêtement négligé la réponse, me regardant droit dans les yeux alors que je me concentrais sur "cette bibliothèque est-elle de 32 bits en 64 bits?":

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

Donc, la leçon apprise. Quoi qu'il en soit, le reste m'a au moins amené à 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 à l'aide de la variable d'environnement HADOOP_OPTS, mais en vain. Alors j'ai regardé le code source. Le module qui génère l'erreur vous indique l'indice ( 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, allez voir ce que ça donne:

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 certaine journalisation de niveau de débogage - passons à cela si nous obtenons une aide supplémentaire. Ceci est fait en ajoutant 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, telle que stop-dfs.sh, et j'ai obtenu cette aubaine:

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 est la version de GLIBC que j'ai? Voici une astuce simple à découvrir:

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

Donc, je ne peux pas mettre à jour mon système d'exploitation à la version 2.14. La seule solution est de construire les bibliothèques natives à partir de sources sur mon système d'exploitation ou de supprimer l'avertissement et de l'ignorer pour l'instant. Pour le moment, j'ai décidé de supprimer l'avertissement ennuyeux (mais prévoyez de construire à partir de sources à l'avenir). Achetez en utilisant les mêmes options de journalisation que nous avions utilisées pour obtenir le message de débogage, à l'exception du niveau ERROR.

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

J'espère que cela aidera les autres à comprendre que l'un des principaux avantages des logiciels open source est que vous pouvez résoudre ce problème si vous suivez des étapes logiques simples.

49
chromeeagle

J'ai eu le même problème. C'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"
21
Neeraj

Dans mon cas, après avoir créé hadoop sur mon SE Linux 64 bits, j'ai remplacé la bibliothèque native dans hadoop/lib. Le problème persiste. Ensuite, j'ai compris que le hadoop désignait hadoop/lib et non pas le hadoop/lib/native. Je viens donc de déplacer tout le contenu de la bibliothèque native vers son parent. Et l'avertissement vient de disparaître.

21
koti

Après une recherche continue comme suggéré par Koti, le problème a été résolu.

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é

13
Nagarjuna D N

Cela fonctionnerait aussi:

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

Pour ceux sur OSX avec Hadoop installé via Homebrew, suivez ces étapes en remplaçant le chemin et la version de 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"
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 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 je devais donner

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

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

Pensé que cela pourrait aider quelqu'un qui a rencontré les mêmes obstacles que moi

8
user2229544

Déplacez vos fichiers de bibliothèque natifs compilés dans le dossier $HADOOP_HOME/lib.

Puis définissez vos variables d’environnement en modifiant le fichier .bashrc

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 native compilés sont dans le dossier $HADOOP_HOME/lib.

ça devrait marcher.

5
Vijayakumar

Cette ligne ici:

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

De la réponse de KunBetter, a travaillé pour moi. Il suffit de l’ajouter au fichier .bashrc et de recharger le contenu .bashrc

$ 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

En plus de la réponse acceptée par @zhutoulala, voici une mise à jour pour le faire fonctionner avec la dernière version stable à ce jour (2.8) sur les plateformes ARMHF (Raspberry Pi 3 modèle B). Tout d’abord, je peux confirmer que vous devez recompiler des bibliothèques natives au format ARM 64 bits. Les autres réponses fournies ici basées sur la définition de 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 à Hadoop version 2.8.

Voici mes indications pour Hadoop 2.8:

  • il n'y a toujours pas de paquet protobuf sur la dernière version de 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 de fichier 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-932 ) vous devez copier et coller le correctif 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.

1
mattt

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

1
MangoJo

Cette ligne ici:

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

De la réponse de KunBetter est où l'argent est

1
Tom Kelly

Premièrement: vous pouvez modifier la version de glibc. CentOS fournit des logiciels sécurisés de manière classique, cela signifie également que la version est ancienne, telle que 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 la mettre à jour. Chargement Glibc

Si la version de l'id de glibc actuelle est à droite, vous pouvez ajouter Word en natif à votre HADOOP_OPTS.

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

Pour installer Hadoop, il est beaucoup plus facile d'installer la version gratuite de Cloudera. Il est livré avec une interface graphique conviviale qui simplifie l'ajout de nœuds, il n'y a pas de compilation ou de bourrage de dépendances, il est livré avec des éléments tels que Hive, pig, 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 Web (1.2.3.4:7180) 4) Ajoutez des nœuds supplémentaires dans l'interface graphique (n'installez PAS le logiciel cloudera sur d'autres nœuds, il le fait pour vous) 5) Dans l'interface graphique Web, accédez à Accueil, cliquez sur Interface utilisateur Web Hue and Hue. Cela vous donne accès à Hive, Pig, Sqoop, etc.

0
MikeKulls

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 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 effectué les opérations suivantes pour une configuration unique sur Ubuntu, ce qui évite d'avoir à 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

Remplacer l'utilisateur par votre nom d'utilisateur

0
Jonathan L

Remède vérifié des publications précédentes:

1) Vérification que le libhadoop.so.1.0.0 fourni avec la distribution Hadoop a été compilé 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 de -Djava.library.path=<path> à HADOOP_OPT dans hadoop-env.sh:

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

Cela a effectivement fait disparaître l'avertissement agaçant.

0
piiteraq