Advertencia de Hadoop "No se puede cargar la biblioteca de hadoop nativo para su plataforma"

269

Actualmente estoy configurando hadoop en un servidor que ejecuta CentOs . Cuando ejecuto start-dfs.sho stop-dfs.sh, aparece el siguiente error:

WARN util.NativeCodeLoader: no se puede cargar la biblioteca nativa-hadoop para su plataforma ... usando clases incorporadas-java donde corresponda

Estoy ejecutando Hadoop 2.2.0.

Al hacer una búsqueda en línea, apareció este enlace: http://balanceandbreath.blogspot.ca/2013/01/utilnativecodeloader-unable-to-load.html

Sin embargo, el contenido del /native/directorio en hadoop 2.x parece ser diferente, por lo que no estoy seguro de qué hacer.

También he agregado estas dos variables de entorno en 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 /"

¿Algunas ideas?

Olshansk
fuente
3
Para búsquedas: este problema también se aplica al menos a Hadoop 2.4.0, Hadoop 2.4.1 y probablemente a otras versiones.
Greg Dubicki
La documentación sobre cómo usar las bibliotecas nativas está en hadoop.apache.org/docs/current/hadoop-project-dist/…
James Moore

Respuestas:

227

Supongo que está ejecutando Hadoop en CentOS de 64 bits. La razón por la que vio esa advertencia es que la biblioteca nativa de Hadoop en $HADOOP_HOME/lib/native/libhadoop.so.1.0.0realidad se compiló en 32 bits.

De todos modos, es solo una advertencia y no afectará las funcionalidades de Hadoop.

Este es el camino si desea eliminar esta advertencia, descargue el código fuente de Hadoop y vuelva libhadoop.so.1.0.0a compilar en el sistema de 64 bits, luego reemplace el de 32 bits.

Aquí se incluyen pasos sobre cómo recompilar el código fuente para Ubuntu:

Buena suerte.

zhutoulala
fuente
77
No funciona para mi Me da lo mismo No se puede cargar la biblioteca de hadoop nativo para el error de su plataforma.
Akshay Hazari
77
Incluso si esto no funciona exactamente, sigue siendo útil. Entonces, ¿esto afectará el rendimiento?
WattsInABox
1
Estoy usando el mismo tar de Hadoop 2.5.0 en Centos 7 y Centos 6.5. Ambos son sistemas operativos de 64 bits. No hay tal advertencia en Centos7 pero Centos 6.5 me da esta advertencia, ¿por qué?
sandip divekar
Gracias. No me di cuenta de que es una advertencia. En realidad dice "start namenode" y la última oración es "No se puede cargar el hadoop nativo", lo que causó temor.
Kaushik Lele
Tenga en cuenta que en realidad no tiene que compilar Hadoop completo, como sugieren las instrucciones, hadoop-common-project/hadoop-commony hadoop-hdfs-project/hadoop-hdfses suficiente.
Greg Dubicki
152

Solo agrega una palabra nativa a tu HADOOP_OPTScomo esta:

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

PD: gracias Searene

Hoai-Thu Vuong
fuente
Esto también lo hizo por mí. En Ubuntu con Hadoop 2.6, la ruta era /home/user/hadoop-2.6.0/lib/native
pelazem el
25
export HADOOP_OPTS = "- Djava.library.path = $ HADOOP_HOME / lib / native"
Searene
1
Creo que dos soluciones son iguales. Según el documento , java.library.path es una lista de rutas para buscar al cargar las bibliotecas. Para que pueda exportar LD_LIBRARY_PATH o usar la opción -D en la línea de comandos de Java. En la línea de comando de Java, y -D <property> = value nos permiten establecer un valor de propiedad del sistema.
Hoai-Thu Vuong
54

La respuesta depende ... Acabo de instalar Hadoop 2.6 de tarball en CentOS 6.6 de 64 bits. La instalación de Hadoop realmente vino con una biblioteca nativa precompilada de 64 bits. Para mi instalación, está aquí:

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

Y sé que es de 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)

Desafortunadamente, estúpidamente pasé por alto la respuesta allí mismo mirándome a la cara mientras me enfocaba en "¿Es esta biblioteca 32 pr 64 bit?":

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

Entonces, la lección aprendida. De todos modos, el resto al menos me llevó a poder suprimir la advertencia. Así que continué e hice todo lo recomendado en las otras respuestas para proporcionar la ruta de la biblioteca usando la variable de entorno HADOOP_OPTS en vano. Así que miré el código fuente. El módulo que genera el error le dice la pista ( 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

Entonces, fuera de aquí para ver qué hace:

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

Ah, hay algunos registros de nivel de depuración. Vamos a ver si obtenemos ayuda adicional. Esto se hace agregando la siguiente línea al archivo $ HADOOP_CONF_DIR / log4j.properties:

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

Luego ejecuté un comando que genera la advertencia original, como stop-dfs.sh, y obtuve este regalo:

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)

Y la respuesta se revela en este fragmento del mensaje de depuración (lo mismo que el comando ldd anterior 'intentó' decirme:

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

¿Qué versión de GLIBC tengo? Aquí hay un truco simple para descubrir:

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

Por lo tanto, no puedo actualizar mi sistema operativo a 2.14. La única solución es construir las bibliotecas nativas a partir de las fuentes en mi sistema operativo o suprimir la advertencia e ignorarla por ahora. Opté por suprimir la advertencia molesta por ahora (pero planeo construir desde fuentes en el futuro) comprar usando las mismas opciones de registro que usamos para obtener el mensaje de depuración, excepto ahora, solo haga que sea ERROR.

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

Espero que esto ayude a otros a ver que un gran beneficio del software de código abierto es que puedes resolver esto si sigues algunos pasos lógicos simples.

chromeeagle
fuente
44
Gracias señor por esta respuesta bellamente detallada. Obtuve mi respuesta y aprendí algo valioso (algunas cosas) en el proceso.
dogwynn
26

Tuve el mismo problema. Se resuelve agregando las siguientes líneas en .bashrc:

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
Neeraj
fuente
55
Tuve que agregar "/ native" al valor HADOOP_OPTS
Ala 'Alnajjar
21

En mi caso, después de construir hadoop en mi SO Linux mint de 64 bits, reemplacé la biblioteca nativa en hadoop/lib. Aún persiste el problema. Entonces me di cuenta de la que apunta a hadoop hadoop/libno al hadoop/lib/native. Así que simplemente moví todo el contenido de la biblioteca nativa a su padre. Y la advertencia acaba de desaparecer.

koti
fuente
Simplemente he intentado todo en la red. Me cansé y simplemente vacié todos los archivos en la carpeta lib en sí, es decir, los compilados utilizando los enlaces proporcionados en la respuesta anterior. Finalmente, no sé por qué, a pesar de los votos negativos que obtuve, probé su sugerencia y funcionó después de una tremenda lucha que soporté durante un día detrás de todo esto. No importó si cambié la ubicación de la biblioteca nativa en .bashrc o hadoop-env.sh. Gracias una tonelada
Akshay Hazari
Me cansé y acabé de vaciar todos los archivos de carpetas nativas en la carpeta lib, es decir, los compilados utilizando los enlaces proporcionados en la respuesta anterior (carpeta nativa en el nuevo hadoop-2.4.0-src.tar.gz.)
Akshay Hazari
15

Esto también funcionaría:

export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native
Kalyan Ghosh
fuente
1
Gracias. Si anula LD_LIBRARY_PATH para usar tomcat apr, simplemente agregue la ruta nativa hadoop como `export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: / usr / lib / hadoop / lib / native.
Eric
esto solo funciona para mí. (Probé todas las otras respuestas).
sailfish009
13

Después de una investigación continua como lo sugirió Koti, resolví el 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 * ../

Salud

Nagarjuna DN
fuente
11

Para aquellos en OSX con Hadoop instalado a través de Homebrew, siga estos pasos reemplazando la ruta y la versión de Hadoop cuando corresponda

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/

luego actualice 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"
Philip O'Brien
fuente
Gracias Philip Esta solución funcionó a la perfección. En mi caso, todo lo que necesitaba era la opción Djava.library.path. Eso era exactamente lo que estaba buscando. ¡¡¡Gracias!!!
arcee123
Muchas gracias. Tengo bzip2: false, openssl: false build no es compatible con openssl. Los otros tienen camino apareciendo. Alguna sugerencia.
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
fuente
8

@zhutoulala - FWIW tus enlaces funcionaron para mí con Hadoop 2.4.0 con una excepción, tuve que decirle a Maven que no construyera los javadocs. También utilicé el parche en el primer enlace para 2.4.0 y funcionó bien. Aquí está el comando Maven que tuve que emitir

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

Después de construir esto y mover las bibliotecas, no olvide actualizar hadoop-env.sh :)

Pensé que esto podría ayudar a alguien que se encontró con los mismos obstáculos que yo

usuario2229544
fuente
5

Mueva sus archivos de biblioteca nativa compilados a la $HADOOP_HOME/libcarpeta.

Luego configure sus variables de entorno editando el .bashrcarchivo

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

Asegúrese de que sus archivos de biblioteca nativa compilados estén en la $HADOOP_HOME/libcarpeta.

deberia de funcionar.

Vijayakumar
fuente
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
fuente
Sí, debería haber compilado 64bit lib / native a través del recurso hadoop.
KunBetter
2

Esta línea aquí:

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

Por la respuesta de KunBetter, funcionó para mí. Simplemente agréguelo al archivo .bashrc y vuelva a cargar el contenido .bashrc

$ source ~/.bashrc
SiendoSachin
fuente
Estoy usando la versión hadoop-2.6.0 en mi sistema local. También estaba enfrentando el mismo problema. Luego descargué el hadoop-2.7.1-src y construí bibliotecas binarias y nativas, también reemplacé las bibliotecas nativas hadoop-2.6.0 con las nativas recién compiladas. Pero aún recibía los mismos errores. Entonces yo export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATHy funcionó para mí.
ParagFlume
1

Esta línea aquí:

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

De la respuesta de KunBetter es dónde está el dinero

Tom Kelly
fuente
En mi caso, necesitaba ambos: export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH y export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH
borice
1

Tuve el mismo problema con JDK6, cambié el JDK a JDK8, el problema se resolvió. Intenta usar JDK8 !!!

MangoJo
fuente
1

Además de la respuesta aceptada de @zhutoulala, aquí hay una actualización para que funcione con la última versión estable hasta la fecha (2.8) en plataformas ARMHF (Raspberry Pi 3 modelo B). Primero puedo confirmar que debe volver a compilar bibliotecas nativas para ARM de 64 bits, otras respuestas aquí basadas en la configuración de algunas variables de entorno no funcionarán. Como se indica en la documentación de Hadoop, las bibliotecas nativas preconstruidas son de 32 bits.

Los pasos de alto nivel dados en el enlace de puño ( http://www.ercoppa.org/posts/how-to-compile-apache-hadoop-on-ubuntu-linux.html ) son correctos. En esta url http://www.instructables.com/id/Native-Hadoop-260-Build-on-Pi/ obtendrá más detalles específicos de Raspberry Pi, pero no de Hadoop versión 2.8.

Aquí están mis indicaciones para Hadoop 2.8:

  • todavía no hay un paquete de protobuf en el último Raspbian, por lo que debe compilarlo usted mismo y la versión debe ser exactamente protobuf 2.5 ( https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz )
  • Se debe cambiar el método de parcheo del archivo CMake. Más aún, los archivos para parchar no son lo mismo. Desafortunadamente, no hay un parche aceptado en JIRA específico para 2.8. En esta URL ( https://issues.apache.org/jira/browse/HADOOP-9320 ) debe copiar y pegar el parche propuesto por Andreas Muttscheller en su 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

Una vez que la construcción es exitosa:

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

Y reemplace el contenido del directorio lib / native de su instalación de Hadoop con el contenido de este archivo. El mensaje de advertencia al ejecutar Hadoop debería desaparecer.

mattt
fuente
0

Para instalar Hadoop es muchísimo más fácil instalar la versión gratuita de Cloudera. Viene con una buena interfaz gráfica de usuario que hace que sea sencillo agregar nodos, no hay compilación o relleno con dependencias, viene con cosas como colmena, cerdo, etc.

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

Los pasos son: 1) Descargar 2) Ejecutarlo 3) Ir a la GUI web (1.2.3.4:7180) 4) Agregar nodos adicionales en la interfaz gráfica de usuario web (NO instale el software cloudera en otros nodos, lo hace todo por usted) 5) Dentro de la GUI web, vaya a Inicio, haga clic en Hue y UI web Hue. Esto le da acceso a Hive, Pig, Sqoop, etc.

MikeKulls
fuente
Las distribuciones de Cloudera están muchas veces por detrás de las versiones actuales disponibles para muchos de los paquetes. si quieres "lo último y lo mejor", Apache Hadoop es el camino a seguir
Nerrve
0

Remedio verificado de publicaciones anteriores:

1) Verifiqué que el libhadoop.so.1.0.0envío con la distribución de Hadoop se compiló para la arquitectura de mi máquina, que es 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) Agregado -Djava.library.path=<path>a HADOOP_OPTen hadoop-env.sh:

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

De hecho, esto hizo desaparecer la molesta advertencia.

piiteraq
fuente
0

En primer lugar: puede modificar la versión de glibc. CentOS proporciona software seguro tradicionalmente, también significa que la versión es antigua, como glibc, protobuf ...

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

Puede comparar la versión de glibc actual con la glibc necesaria.

En segundo lugar: si la versión del glibc actual es antigua, puede actualizar el glibc. DownLoad Glibc

Si la versión de la identificación actual de glibc es correcta, puede agregar una palabra nativa a su HADOOP_OPTS

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

No estoy usando CentOS. Esto es lo que tengo en Ubuntu 16.04.2, hadoop-2.7.3, jdk1.8.0_121. Ejecute start-dfs.sh o stop-dfs.sh correctamente sin error:

# 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

Reemplace / j01 / sys / jdk, / j01 / srv / hadoop con su ruta de instalación

También hice lo siguiente para una configuración única en Ubuntu, lo que elimina la necesidad de ingresar contraseñas varias veces al ejecutar start-dfs.sh:

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

Reemplazar usuario con su nombre de usuario

Jonathan L
fuente
0

Básicamente, no es un error, es una advertencia en el clúster de Hadoop. Aquí solo actualizamos las variables de entorno.

exportar HADOOP_OPTS = "$ HADOOP_OPTS" -Djava.library.path = / usr / local / hadoop / lib
 exportar HADOOP_COMMON_LIB_NATIVE_DIR = "/ usr / local / hadoop / lib / native"
Spandana r
fuente