java - Advertencia de "No se puede cargar la biblioteca nativa-hadoop para su plataforma" de Hadoop
linux hadoop2 (20)
@zhutoulala - FWIW sus enlaces funcionaron para mí con Hadoop 2.4.0 con una excepción que tuve que decirle a Maven que no construya los javadocs. También usé el parche en el primer enlace para 2.4.0 y funcionó bien. Aquí está el comando de experto que tuve que emitir
mvn package -Dmaven.javadoc.skip=true -Pdist,native -DskipTests -Dtar
Después de compilar esto y mover las bibliotecas, no olvide actualizar hadoop-env.sh :)
Pensé que esto podría ayudar a alguien que se topó con los mismos obstáculos que yo
Actualmente estoy configurando hadoop en un servidor que ejecuta CentOs . Cuando ejecuto start-dfs.sh
o stop-dfs.sh
, obtengo el siguiente error:
WARN util.NativeCodeLoader: no se puede cargar la biblioteca nativa-hadoop para su plataforma ... usando clases java incorporadas donde corresponda
Estoy corriendo 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, los contenidos del directorio /native/
en hadoop 2.x parecen ser diferentes, así que no estoy seguro de qué hacer.
También he agregado estas dos variables de entorno en hadoop-env.sh
:
exportar HADOOP_OPTS = "$ HADOOP_OPTS -Djava.library.path = / usr / local / hadoop / lib /"
exportar HADOOP_COMMON_LIB_NATIVE_DIR = "/ usr / local / hadoop / lib / native /"
¿Algunas ideas?
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 recompilar las bibliotecas nativas a ARM de 64 bits, otras respuestas 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 predefinidas son de 32 bits.
Los pasos de alto nivel dados en el primer enlace ( 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 para la versión 2.8 de Hadoop.
Aquí están mis indicaciones para Hadoop 2.8:
- Todavía no hay un paquete 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 )
El método de parcheado de archivos CMake debe ser cambiado. Además, los archivos a parchear 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 de 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. Mensaje de advertencia cuando se ejecuta Hadoop debe desaparecer.
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 * ../
Aclamaciones
En mi caso, después de construir hadoop en mi sistema operativo Linux mint de 64 bits, reemplacé la biblioteca nativa en hadoop/lib
. Aún persiste el problema. Luego descubrí el hadoop apuntando a hadoop/lib
no a hadoop/lib/native
. Así que acabo de mover todo el contenido de la biblioteca nativa a su padre. Y la advertencia acaba de desaparecer.
En primer lugar: puede modificar la versión de glibc. CentOS proporciona software seguro de manera tradicional, 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 glibc necesario.
En segundo lugar: si la versión de glibc actual es antigua, puede actualizar glibc. Bajar carga glibc
Si la versión de la identificación de glibc actual es correcta, puede agregar la 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"
Esta línea aquí:
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
De la respuesta de KunBetter es donde está el dinero.
Esta línea aquí:
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
De la respuesta de KunBetter, trabajé para mí. Solo agréguelo al archivo .bashrc y vuelva a cargar los contenidos de .bashrc
$ source ~/.bashrc
Esto también funcionaría:
export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native
La respuesta depende ... Acabo de instalar Hadoop 2.6 de tarball en CentOS 6.6 de 64 bits. La instalación de Hadoop sí vino con una biblioteca nativa preconstruida 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 fijamente a la cara cuando estaba enfocado en "¿Es esta biblioteca 32 pr 64 bit?"
`GLIBC_2.14'' not found (required by ./libhadoop.so.1.0.0)
Entonces, 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 utilizando la variable de entorno HADOOP_OPTS en vano. Así que miré el código fuente. El módulo que genera el error le indica la sugerencia ( 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
Así que, hasta aquí para ver lo que hace:
Ah, hay algunos registros de nivel de depuración; vamos a activar eso para ver si obtenemos alguna 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 anterior comando ldd ''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 simple truco 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 crear las bibliotecas nativas a partir de las fuentes de mi sistema operativo o suprimir la advertencia y simplemente ignorarla por ahora. Opté por solo suprimir la advertencia molesta por ahora (pero planeo construir desde fuentes en el futuro) compre usando las mismas opciones de registro que usamos para obtener el mensaje de depuración, excepto ahora, solo haga que sea el nivel de 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 puede resolver esto si toma algunos pasos lógicos simples.
Mueva los archivos de la biblioteca nativa compilada a la $HADOOP_HOME/lib
.
Luego configura tus variables de entorno editando el archivo .bashrc
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 nativos compilados estén en la $HADOOP_HOME/lib
.
deberia de funcionar.
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 la configuración de una sola vez 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
Reemplaza al usuario con tu nombre de usuario
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 sea apropiado
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/
a continuación, 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"
Para instalar Hadoop es mucho más fácil instalar la versión gratuita de Cloudera. Viene con una interfaz gráfica de usuario agradable que hace que sea fácil 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) Ejecutar 3) Ir a la GUI web (1.2.3.4:7180) 4) Agregar nodos adicionales en la gui 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 Tono y Tono Web UI. Esto le da acceso a Hive, Pig, Sqoop, etc.
Remedio verificado de publicaciones anteriores:
1) Comprobé que el libhadoop.so.1.0.0
incluido 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) Se agregó -Djava.library.path=<path>
a HADOOP_OPT
en hadoop-env.sh
:
export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -Djava.library.path=/opt/hadoop-2.6.0/lib/native"
Esto hizo que la molesta advertencia desapareciera.
Simplemente agregue la palabra nativa de su HADOOP_OPTS
esta manera:
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native"
PD: Gracias Searene
Supongo que está ejecutando Hadoop en 64bit CentOS. La razón por la que vio esa advertencia es la biblioteca nativa de Hadoop $HADOOP_HOME/lib/native/libhadoop.so.1.0.0
realidad se compiló en 32 bits.
De todos modos, es solo una advertencia y no afectará las funcionalidades de Hadoop.
Esta es la forma si desea eliminar esta advertencia, descargue el código fuente de Hadoop y libhadoop.so.1.0.0
compilar libhadoop.so.1.0.0
en un sistema de 64 bits, luego reemplace el de 32 bits.
Los pasos sobre cómo recompilar el código fuente se incluyen aquí para Ubuntu:
Buena suerte.
Tuve el mismo problema con JDK6, cambié el JDK a JDK8, el problema se resolvió. Trate de usar JDK8 !!!
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"
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
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"