Hadoop Avviso "Impossibile caricare la libreria native-hadoop per la tua piattaforma"


269

Attualmente sto configurando hadoop su un server che esegue CentOs . Quando eseguo start-dfs.sho stop-dfs.sh, visualizzo il seguente errore:

WARN util.NativeCodeLoader: impossibile caricare la libreria native-hadoop per la tua piattaforma ... usando le classi builtin-java dove applicabile

Sto eseguendo Hadoop 2.2.0.

Effettuando una ricerca online viene visualizzato questo link: http://balanceandbreath.blogspot.ca/2013/01/utilnativecodeloader-unable-to-load.html

Tuttavia, il contenuto della /native/directory su hadoop 2.x sembra essere diverso, quindi non sono sicuro di cosa fare.

Ho anche aggiunto queste due variabili d'ambiente in 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 /"

Qualche idea?


3
Per la ricerca: questo problema si applica almeno a Hadoop 2.4.0, Hadoop 2.4.1 e probabilmente ad altre versioni.
Greg Dubicki,

La documentazione su come utilizzare le librerie native è disponibile su hadoop.apache.org/docs/current/hadoop-project-dist/…
James Moore

Risposte:


227

Suppongo che stai eseguendo Hadoop su CentOS a 64 bit. Il motivo per cui è stato riscontrato che l'avviso è che la libreria Hadoop nativa è $HADOOP_HOME/lib/native/libhadoop.so.1.0.0stata effettivamente compilata a 32 bit.

Ad ogni modo, è solo un avvertimento e non avrà alcun impatto sulle funzionalità di Hadoop.

Ecco il modo se si desidera eliminare questo avviso, scaricare il codice sorgente di Hadoop e ricompilare libhadoop.so.1.0.0sul sistema a 64 bit, quindi sostituire quello a 32 bit.

I passaggi su come ricompilare il codice sorgente sono inclusi qui per Ubuntu:

In bocca al lupo.


7
Non funziona per me. Mi dà lo stesso Impossibile caricare la libreria native-hadoop per l'errore della piattaforma.
Akshay Hazari,

7
Anche se questo non funziona esattamente, è comunque utile. Quindi questo impatto sulle prestazioni, a tutti?
WattsInABox,

1
Sto usando lo stesso tar hadoop 2.5.0 su Centos 7 e Centos 6.5. Entrambi sono sistemi operativi a 64 bit. Non esiste tale avviso su Centos7 ma Centos 6.5 mi dà questo avviso, perché?
sandip divekar

Grazie. Non mi ero reso conto che si tratta di un avvertimento. In realtà dice "start namenode" e l'ultima frase è "Impossibile caricare native-hadoop .." che ha causato paura.
Kaushik Lele,

Si noti che in realtà non è necessario compilare l'intero Hadoop, come suggerito dalle istruzioni, hadoop-common-project/hadoop-commoned hadoop-hdfs-project/hadoop-hdfsè sufficiente.
Greg Dubicki,

152

Basta aggiungere la parola nativa alla tua in HADOOP_OPTSquesto modo:

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

PS: Grazie a Searene


Lo ha fatto anche per me. Su Ubuntu con Hadoop 2.6, il percorso era
/home/user/hadoop-2.6.0/lib/native

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

1
Penso che due soluzioni siano uguali. Secondo doc , java.library.path è un elenco di percorsi da cercare durante il caricamento delle librerie. In questo modo, puoi esportare LD_LIBRARY_PATH o utilizzare l' opzione -D nella riga di comando java. Nella riga di comando java e -D <proprietà> = valore ci consente di impostare un valore della proprietà di sistema.
Hoai-Thu Vuong,

54

La risposta dipende ... Ho appena installato Hadoop 2.6 da tarball su CentOS 6.6 a 64 bit. L'installazione di Hadoop è stata effettivamente fornita con una libreria nativa a 64 bit preconfigurata. Per la mia installazione, è qui:

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

E so che è a 64 bit:

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

Sfortunatamente, ho stupidamente trascurato la risposta proprio lì fissandomi in faccia mentre ero concentrato su "È questa libreria 32 pr 64 bit?":

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

Quindi, lezione imparata. Comunque, il resto almeno mi ha portato a riuscire a sopprimere l'avvertimento. Quindi ho continuato e fatto tutto quanto raccomandato nelle altre risposte per fornire il percorso della libreria utilizzando la variabile di ambiente HADOOP_OPTS senza alcun risultato. Quindi ho guardato il codice sorgente. Il modulo che genera l'errore indica il suggerimento ( 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

Quindi, via a qui per vedere cosa fa:

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

Ah, c'è un po 'di registrazione a livello di debug - accendiamolo per vedere se otteniamo qualche aiuto aggiuntivo. Questo viene fatto aggiungendo la seguente riga al file $ HADOOP_CONF_DIR / log4j.properties:

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

Quindi ho eseguito un comando che genera l'avviso originale, come stop-dfs.sh, e ho ottenuto questo tesoro:

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)

E la risposta è rivelata in questo frammento del messaggio di debug (la stessa cosa che il precedente comando ldd 'ha provato' a dirmi:

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

Quale versione di GLIBC ho? Ecco un semplice trucco per scoprirlo:

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

Quindi, non riesco ad aggiornare il mio SO a 2.14. L'unica soluzione è costruire le librerie native dai sorgenti sul mio sistema operativo o sopprimere l'avviso e ignorarlo per ora. Ho deciso di sopprimere il fastidioso avvertimento per ora (ma prevedi di costruire da fonti in futuro) acquistare utilizzando le stesse opzioni di registrazione che abbiamo usato per ottenere il messaggio di debug, tranne ora, renderlo a livello di ERRORE.

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

Spero che questo aiuti gli altri a capire che un grande vantaggio del software open source è che puoi capire queste cose se fai alcuni semplici passaggi logici.


4
Grazie signore per questa risposta meravigliosamente dettagliata. Ho ottenuto la mia risposta e ho imparato qualcosa di prezioso (qualche volta) nel processo.
dogwynn,

26

Ho avuto lo stesso problema. Viene risolto aggiungendo le seguenti righe in .bashrc:

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

5
Ho dovuto aggiungere "/ native" al valore HADOOP_OPTS
Ala 'Alnajjar il

21

Nel mio caso, dopo aver creato hadoop sul mio sistema operativo Linux a 64 bit, ho sostituito la libreria nativa in hadoop/lib. Il problema persiste ancora. Poi ho capito il hadoop indicando di hadoop/libnon hadoop/lib/native. Quindi ho appena spostato tutto il contenuto dalla libreria nativa al suo genitore. E l'avvertimento è appena andato.


Mi è capitato di aver provato tutto in rete. Mi sono stancato e ho semplicemente svuotato tutti i file nella cartella lib stessa, cioè quelli compilati usando i collegamenti forniti nella risposta sopra. Finalmente non so perché, nonostante i voti negativi, ho provato il tuo suggerimento e ha funzionato dopo un'enorme lotta che ho sopportato per un giorno dietro tutto questo. Non importava se ho cambiato la posizione della libreria nativa in .bashrc o hadoop-env.sh. Grazie mille.
Akshay Hazari,

Mi sono stancato e ho semplicemente svuotato tutti i file delle cartelle native nella cartella lib stessa, cioè quelli compilati usando i collegamenti forniti nella risposta sopra (cartella nativa nel nuovo hadoop-2.4.0-src.tar.gz.)
Akshay Hazari

15

Anche questo funzionerebbe:

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

1
Grazie. Se si esegue l'override di LD_LIBRARY_PATH per utilizzare tomcat apr, basta aggiungere il percorso nativo di hadoop come `export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: / usr / lib / hadoop / lib / native.
Eric,

questa funziona solo per me. (provato tutte le altre risposte).
sailfish009

13

Dopo una continua ricerca come suggerito da Koti, ho risolto il problema.

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

Saluti


11

Per quelli su OSX con Hadoop installato tramite Homebrew, segui questi passaggi sostituendo il percorso e la versione di Hadoop dove appropriato

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/

quindi aggiorna hadoop-env.sh con

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"

Grazie Filippo. Questa soluzione ha funzionato perfettamente. Nel mio caso, tutto ciò di cui avevo bisogno era l'opzione Djava.library.path. Era esattamente quello che stavo cercando. Grazie!!!
arcee123,

Grazie mille. Ho bzip2: false, openssl: false build non supporta openssl. Gli altri hanno percorso. Eventuali suggerimenti.
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"

8

@zhutoulala - FWIW i tuoi collegamenti hanno funzionato per me con Hadoop 2.4.0 con un'eccezione che ho dovuto dire a Maven di non creare i javadocs. Ho anche usato la patch nel primo link per 2.4.0 e ha funzionato bene. Ecco il comando maven che ho dovuto emettere

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

Dopo aver creato questo e spostato le librerie, non dimenticare di aggiornare hadoop-env.sh :)

Pensavo che ciò potesse aiutare qualcuno che ha incontrato gli stessi blocchi stradali di me


5

Sposta i file della libreria nativa compilati nella $HADOOP_HOME/libcartella.

Quindi imposta le variabili di ambiente modificando il .bashrcfile

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

Assicurarsi che i file della libreria nativa compilati siano nella $HADOOP_HOME/libcartella.

dovrebbe funzionare.


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

sì, dovresti avere ricompilato 64 bit lib / native tramite la risorsa hadoop.
KunBetter,

2

Questa linea proprio qui:

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

Dalla risposta di KunBetter, ha funzionato per me. Basta aggiungerlo al file .bashrc e ricaricare i contenuti .bashrc

$ source ~/.bashrc

Sto usando la versione hadoop-2.6.0 nel mio sistema locale. Stavo anche affrontando lo stesso problema. Quindi ho scaricato hadoop-2.7.1-src e ho creato librerie binarie e native, ho anche sostituito le librerie native hadoop-2.6.0 con i nativi di nuova costruzione. Ma continuavo a riscontrare gli stessi errori. Quindi io export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATHe lui ha funzionato per me.
ParagFlume

1

Questa linea proprio qui:

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

Dalla risposta di KunBetter è dove sono i soldi


Nel mio caso avevo bisogno di entrambi: export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH e export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH
borice,

1

Ho avuto lo stesso problema con JDK6, ho cambiato JDK in JDK8, il problema è stato risolto. Prova a usare JDK8 !!!


1

Oltre alla risposta accettata da @zhutoulala, ecco un aggiornamento per farlo funzionare con l'ultima versione stabile fino ad oggi (2.8) su piattaforme ARMHF (Raspberry Pi 3 modello B). Per prima cosa posso confermare che è necessario ricompilare le librerie native in ARM a 64 bit, altre risposte qui basate sull'impostazione di alcune variabili di ambiente non funzioneranno. Come indicato nella documentazione di Hadoop, le librerie native predefinite sono a 32 bit.

I passaggi di alto livello indicati nel link del pugno ( http://www.ercoppa.org/posts/how-to-compile-apache-hadoop-on-ubuntu-linux.html ) sono corretti. Su questo URL http://www.instructables.com/id/Native-Hadoop-260-Build-on-Pi/ sono disponibili ulteriori dettagli specifici per Raspberry Pi, ma non per Hadoop versione 2.8.

Ecco le mie indicazioni per Hadoop 2.8:

  • non esiste ancora alcun pacchetto protobuf sull'ultimo Raspbian, quindi è necessario compilarlo da soli e la versione deve essere esattamente protobuf 2.5 ( https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz )
  • Il metodo di patching dei file CMake deve essere modificato. Inoltre, i file da correggere non sono gli stessi. Sfortunatamente, non esiste una patch accettata su JIRA specifica per 2.8. Su questo URL ( https://issues.apache.org/jira/browse/HADOOP-9320 ) è necessario copiare e incollare la patch proposta da Andreas Muttscheller sul proprio nome:

    :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

Una volta completata la compilazione:

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

E sostituisci il contenuto della directory lib / native della tua installazione di Hadoop con il contenuto di questo archivio. Il messaggio di avviso durante l'esecuzione di Hadoop dovrebbe scomparire.


0

Per installare Hadoop è molto più facile installare la versione gratuita di Cloudera. Viene fornito con una bella interfaccia grafica che semplifica l'aggiunta di nodi, non c'è compilazione o riempimento con dipendenze, viene fornito con elementi come alveare, maiale ecc.

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

I passaggi sono: 1) Download 2) Esegui 3) Vai alla GUI Web (1.2.3.4:7180) 4) Aggiungi nodi extra nella GUI Web (NON installare il software cloudera su altri nodi, fa tutto per te) 5) All'interno della GUI Web, vai su Home, fai clic su UI Web Hue and Hue. Questo ti dà accesso a Hive, Pig, Sqoop ecc.


Le distribuzioni di Cloudera sono molte volte indietro rispetto alle versioni attuali disponibili per molti dei pacchetti. se vuoi "ultimo e più grande", Apache Hadoop è la strada da percorrere
Nerrve,

0

Rimedio verificato da precedenti pubblicazioni:

1) Controllato che la libhadoop.so.1.0.0spedizione con la distribuzione Hadoop sia stata compilata per la mia architettura di macchina, che è 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) Aggiunto -Djava.library.path=<path>a HADOOP_OPTin hadoop-env.sh:

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

Questo in effetti fece scomparire il fastidioso avvertimento.


0

In primo luogo: puoi modificare la versione di glibc. CentOS fornisce software sicuri in modo transitorio, significa anche che la versione è vecchia come glibc, protobuf ...

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

È possibile confrontare la versione di glibc corrente con glibc necessario.

In secondo luogo: se la versione dell'attuale glibc è obsoleta, è possibile aggiornare glibc. DownLoad Glibc

Se la versione dell'attuale ID glibc è corretta, puoi aggiungere la parola nativa al tuo HADOOP_OPTS

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

0

Non sto usando CentOS. Ecco cosa ho in Ubuntu 16.04.2, hadoop-2.7.3, jdk1.8.0_121. Esegui start-dfs.sh o stop-dfs.sh senza errori:

# 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

Sostituisci / j01 / sys / jdk, / j01 / srv / hadoop con il percorso di installazione

Ho anche fatto quanto segue per una volta l'installazione su Ubuntu, il che elimina la necessità di inserire password per più volte durante l'esecuzione di start-dfs.sh:

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

Sostituisci l'utente con il tuo nome utente


0

Fondamentalmente, non è un errore, è un avvertimento nel cluster Hadoop. Qui semplicemente aggiorniamo le variabili di ambiente.

export HADOOP_OPTS = "$ HADOOP_OPTS" -Djava.library.path = / usr / local / hadoop / lib
 export HADOOP_COMMON_LIB_NATIVE_DIR = "/ usr / local / hadoop / lib / native"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.