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

Resuelto Olshansky asked hace 11 años • 24 respuestas

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

ADVERTENCIA util.NativeCodeLoader: No se puede cargar la biblioteca nativa-hadoop para su plataforma... utilizando clases integradas de Java cuando corresponda

Estoy ejecutando Hadoop 2.2.0.

Al realizar 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 agregué 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?

Olshansky avatar Nov 13 '13 08:11 Olshansky
Aceptado

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

De todos modos, es sólo 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 vuelva a compilarlo libhadoop.so.1.0.0en un sistema de 64 bits, luego reemplace el de 32 bits.

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

  • http://www.ercoppa.org/Linux-Compile-Hadoop-220-fix-Unable-to-load-native-hadoop-library.htm
zhutoulala avatar Nov 15 '2013 04:11 zhutoulala

Simplemente agregue una palabra nativa de HADOOP_OPTSesta manera:

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

PD: Gracias Searene

Hoai-Thu Vuong avatar Jul 24 '2014 07:07 Hoai-Thu Vuong

La respuesta depende... Acabo de instalar Hadoop 2.6 desde tarball en CentOS 6.6 de 64 bits. De hecho, la instalación de Hadoop vino con una biblioteca nativa de 64 bits prediseñada. 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 que estaba ahí mirándome a la cara mientras me concentraba en "¿Esta biblioteca es de 32 o 64 bits?":

`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 usando la variable de entorno HADOOP_OPTS sin éxito. Entonces miré el código fuente. El módulo que genera el error te indica 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, 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; habilitémoslo para 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 detalle:

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í tienes un truco sencillo para descubrirlo:

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

Entonces, no puedo actualizar mi sistema operativo a 2.14. La única solución es crear las bibliotecas nativas a partir de fuentes en mi sistema operativo o suprimir la advertencia e ignorarla por ahora. Opté por simplemente suprimir la molesta advertencia por ahora (pero planeo construir a partir de fuentes en el futuro) y compré usando las mismas opciones de registro que usamos para recibir el mensaje de depuración, excepto que ahora, simplemente póngalo en 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 puedes resolver estas cosas si sigues algunos pasos lógicos simples.

Mark Petronic avatar Jun 18 '2015 23:06 Mark Petronic