Advertencia de Hadoop "No se puede cargar la biblioteca nativa de Hadoop para su plataforma"
Actualmente estoy configurando hadoop en un servidor que ejecuta CentOs . Cuando ejecuto start-dfs.sh
o 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?
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.0
en 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.0
en 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
Simplemente agregue una palabra nativa de HADOOP_OPTS
esta manera:
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native"
PD: Gracias Searene
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.