Aviso Hadoop "Não foi possível carregar a biblioteca nativo-hadoop para sua plataforma"

269

Atualmente, estou configurando o hadoop em um servidor executando o CentOs . Quando executo start-dfs.shou stop-dfs.sh, recebo o seguinte erro:

WARN util.NativeCodeLoader: Não foi possível carregar a biblioteca nativo-hadoop para sua plataforma ... usando classes builtin-java onde aplicável

Estou executando o Hadoop 2.2.0.

Fazer uma pesquisa on-line trouxe esse link: http://balanceandbreath.blogspot.ca/2013/01/utilnativecodeloader-unable-to-load.html

No entanto, o conteúdo do /native/diretório no hadoop 2.x parece ser diferente, portanto não tenho certeza do que fazer.

Também adicionei essas duas variáveis ​​de ambiente em 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 /"

Alguma ideia?

Olshansk
fonte
3
Para pesquisabilidade: esse problema também se aplica pelo menos ao Hadoop 2.4.0, Hadoop 2.4.1 e provavelmente a outras versões.
precisa saber é o seguinte
Documentação para saber como usar bibliotecas nativas está no hadoop.apache.org/docs/current/hadoop-project-dist/...
James Moore

Respostas:

227

Suponho que você esteja executando o Hadoop no CentOS de 64 bits. O motivo pelo qual você viu esse aviso é que a biblioteca nativa do Hadoop $HADOOP_HOME/lib/native/libhadoop.so.1.0.0foi realmente compilada em 32 bits.

Enfim, é apenas um aviso e não afetará as funcionalidades do Hadoop.

Aqui está o caminho, se você deseja eliminar esse aviso, faça o download do código-fonte do Hadoop e recompile libhadoop.so.1.0.0no sistema de 64 bits e substitua o de 32 bits.

As etapas sobre como recompilar o código fonte estão incluídas aqui no Ubuntu:

Boa sorte.

zhutoulala
fonte
7
Não funciona para mim. Dá-me o mesmo Não é possível carregar a biblioteca nativo-hadoop para o erro de sua plataforma.
Akshay Hazari
7
Mesmo que isso não funcione exatamente, ainda é útil. Então isso afetará o desempenho?
WattsInABox
1
Estou usando o mesmo tar do hadoop 2.5.0 no Centos 7 e no Centos 6.5. Ambos são sistemas operacionais de 64 bits. Não existe esse aviso no Centos7, mas o Centos 6.5 me dá esse aviso, por quê?
Sandip divekar
Obrigado. Eu não percebi que é um aviso. Na verdade, diz "iniciar o namenode" e a última frase é "Não é possível carregar o hadoop nativo ..", o que causou medo.
Kaushik Lele
Observe que você realmente não precisa compilar o Hadoop inteiro, como as instruções sugerem - hadoop-common-project/hadoop-commone hadoop-hdfs-project/hadoop-hdfsé suficiente.
precisa saber é o seguinte
152

Basta acrescentar a palavra nativa ao seu HADOOP_OPTS:

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

PS: Obrigado Searene

Hoai-Thu Vuong
fonte
Isso fez isso por mim também. No Ubuntu com Hadoop 2.6, o caminho era /home/user/hadoop-2.6.0/lib/native
pelazem 12/16
25
exportação HADOOP_OPTS = "- Djava.library.path = $ HADOOP_HOME / lib / nativo"
Searene
1
Eu acho que duas soluções são iguais. De acordo com o documento , java.library.path é uma lista de caminhos a serem pesquisados ​​ao carregar as bibliotecas. Para que você possa exportar LD_LIBRARY_PATH ou usar a opção -D na linha de comando java. Na linha de comando java, e -D <property> = value nos permite definir um valor de propriedade do sistema.
Hoai-Thu Vuong
54

A resposta depende ... Acabei de instalar o Hadoop 2.6 do tarball no CentOS 6.6 de 64 bits. A instalação do Hadoop realmente veio com uma biblioteca nativa pré-construída de 64 bits. Para minha instalação, está aqui:

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

E eu sei que é 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)

Infelizmente, estupidamente ignorei a resposta ali mesmo, me encarando quando me concentrei em "Esta biblioteca é de 32 a 64 bits?":

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

Então, lição aprendida. Enfim, o resto pelo menos me levou a ser capaz de suprimir o aviso. Portanto, continuei e fiz tudo o que foi recomendado nas outras respostas para fornecer o caminho da biblioteca usando a variável de ambiente HADOOP_OPTS sem sucesso. Então eu olhei o código fonte. O módulo que gera o erro informa a dica ( 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

Então, vamos aqui para ver o que ele faz:

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

Ah, existe algum log no nível de depuração - vamos ativar isso para ver se obtemos alguma ajuda adicional. Isso é feito adicionando a seguinte linha ao arquivo $ HADOOP_CONF_DIR / log4j.properties:

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

Em seguida, executei um comando que gera o aviso original, como stop-dfs.sh, e recebi o presente:

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 a resposta é revelada neste trecho da mensagem de depuração (a mesma coisa que o comando ldd anterior 'tentou' me dizer:

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

Qual versão do GLIBC eu tenho? Aqui está um truque simples para descobrir:

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

Portanto, não consigo atualizar meu sistema operacional para 2.14. A única solução é criar as bibliotecas nativas a partir de fontes no meu sistema operacional ou suprimir o aviso e ignorá-lo por enquanto. Optei por apenas suprimir o aviso irritante por enquanto (mas planejo construir a partir de fontes no futuro) comprar usando as mesmas opções de log que usamos para obter a mensagem de depuração, exceto agora, basta torná-la no nível de ERRO.

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

Espero que isso ajude outras pessoas a ver que um grande benefício do software de código aberto é que você pode descobrir isso se seguir algumas etapas lógicas simples.

chromeeagle
fonte
4
Obrigado, senhor, por esta resposta bem detalhada. Eu recebi minha resposta e aprendi algo valioso (algumas coisas) no processo.
dogwynn
26

Eu tive o mesmo problema. É resolvido adicionando as seguintes linhas .bashrc:

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
Neeraj
fonte
5
Eu tive que adicionar "/ native" ao valor HADOOP_OPTS
Ala 'Alnajjar
21

No meu caso, depois de criar o hadoop no meu SO mint de 64 bits do Linux, substituí a biblioteca nativa em hadoop/lib. Ainda o problema persiste. Então eu descobri o hadoop apontando para hadoop/libnão o hadoop/lib/native. Acabei de mudar todo o conteúdo da biblioteca nativa para o pai. E o aviso acabou.

koti
fonte
Por acaso tentei de tudo na rede. Eu cansei e esvaziei todos os arquivos na própria pasta lib, ou seja, aqueles compilados usando os links fornecidos na resposta acima. Finalmente, não sei por que, apesar dos votos negativos, tentei sua sugestão e funcionou depois de uma tremenda luta que passei um dia por trás de tudo isso. Não importava se eu havia alterado a localização da biblioteca nativa em .bashrc ou hadoop-env.sh. Graças uma tonelada.
Akshay Hazari
Eu cansei e esvaziei todos os arquivos da pasta nativa na própria pasta lib, ou seja, os compilados usando os links fornecidos na resposta acima (pasta nativa no novo hadoop-2.4.0-src.tar.gz.)
Akshay Hazari
15

Isso também funcionaria:

export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native
Kalyan Ghosh
fonte
1
Obrigado. Se você substituir LD_LIBRARY_PATH para usar o tomcat apr, basta anexar o caminho nativo do hadoop como `export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: / usr / lib / hadoop / lib / native.
Eric Eric
isso só funciona solução para mim. (tentei todas as outras respostas).
sailfish009
13

Após uma pesquisa contínua, conforme sugerido por Koti, resolvi o 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 * ../

Felicidades

Nagarjuna DN
fonte
11

Para aqueles no OSX com Hadoop instalados via Homebrew, siga estas etapas substituindo o caminho e a versão do Hadoop, quando apropriado

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/

atualize o hadoop-env.sh com

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
fonte
Obrigado Philip. Esta solução funcionou perfeitamente. No meu caso, tudo que eu precisava era a opção Djava.library.path. Era exatamente o que eu estava procurando. Obrigado!!!
arcee123
Muito obrigado.Eu tenho bzip2: false, openssl: false build não suporta openssl. Os outros têm caminho aparecendo. Alguma sugestão.
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
fonte
8

@zhutoulala - FWIW seus links funcionaram para mim com o Hadoop 2.4.0, com uma exceção que eu tive que dizer ao maven para não construir os javadocs. Também usei o patch no primeiro link da 2.4.0 e funcionou bem. Aqui está o comando que eu tive que emitir

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

Depois de criar isso e mover as bibliotecas, não se esqueça de atualizar o hadoop-env.sh :)

Pensei que isso poderia ajudar alguém que se deparou com os mesmos obstáculos que eu

user2229544
fonte
5

Mova seus arquivos de biblioteca nativa compilados para a $HADOOP_HOME/libpasta.

Em seguida, defina suas variáveis ​​de ambiente editando o .bashrcarquivo

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

Verifique se os arquivos da biblioteca nativa compilados estão na $HADOOP_HOME/libpasta.

deveria funcionar.

Vijayakumar
fonte
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
fonte
sim, você deve recompilar a lib / nativa de 64 bits via recurso hadoop.
KunBetter
2

Esta linha aqui:

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

Da resposta da KunBetter, funcionou para mim. Basta anexá-lo ao arquivo .bashrc e recarregar o conteúdo .bashrc

$ source ~/.bashrc
BeingSachin
fonte
Estou usando a versão hadoop-2.6.0 no meu sistema local. Eu também estava enfrentando o mesmo problema. Então baixei o hadoop-2.7.1-src e construí bibliotecas binárias e nativas, também substitui as bibliotecas nativas hadoop-2.6.0 pelas novas criadas. Mas ainda estava recebendo os mesmos erros. Então eu export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATHe isso funcionou para mim.
ParagFlume 02/02
1

Esta linha aqui:

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

A resposta da KunBetter é onde está o dinheiro

Tom Kelly
fonte
No meu caso, eu precisava de ambos: 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

Eu tive o mesmo problema com o JDK6, mudei o JDK para JDK8, o problema resolvido. Tente usar o JDK8 !!!

MangoJo
fonte
1

Além da resposta aceita pelo @zhutoulala, aqui está uma atualização para fazê-lo funcionar com a versão estável mais recente até a data (2.8) nas plataformas ARMHF (Raspberry Pi 3 modelo B). Primeiro, posso confirmar que você deve recompilar as bibliotecas nativas para o ARM de 64 bits; outras respostas aqui baseadas na configuração de algumas variáveis ​​de ambiente não funcionarão. Conforme indicado na documentação do Hadoop, as bibliotecas nativas pré-criadas são de 32 bits.

As etapas de alto nível fornecidas no link fist ( http://www.ercoppa.org/posts/how-to-compile-apache-hadoop-on-ubuntu-linux.html ) estão corretas. Nesse URL, http://www.instructables.com/id/Native-Hadoop-260-Build-on-Pi/, você obtém mais detalhes específicos sobre o Raspberry Pi, mas não para o Hadoop versão 2.8.

Aqui estão minhas indicações para o Hadoop 2.8:

  • ainda não existe um pacote protobuf no Raspbian mais recente, portanto você deve compilá-lo e a versão deve ser exatamente protobuf 2.5 ( https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz )
  • O método de correção de arquivos do CMake deve ser alterado. Além disso, os arquivos a serem corrigidos não são os mesmos. Infelizmente, não há patch aceito no JIRA específico para 2.8. Nesta URL ( https://issues.apache.org/jira/browse/HADOOP-9320 ), você deve copiar e colar o patch proposto por Andreas Muttscheller em seu 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

Depois que a compilação for bem-sucedida:

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

E substitua o conteúdo do diretório lib / native da sua instalação do Hadoop pelo conteúdo deste arquivo. A mensagem de aviso ao executar o Hadoop deve desaparecer.

mattt
fonte
0

Para instalar o Hadoop, é muito mais fácil instalar a versão gratuita do Cloudera. Ele vem com uma interface gráfica agradável que simplifica a adição de nós, não há compilação ou preenchimento de dependências, ele vem com itens como colmeia, porco etc.

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

As etapas são: 1) Download 2) Execute-o 3) Acesse a GUI da web (1.2.3.4:7180) 4) Adicione nós extras no GUI da web (NÃO instale o software cloudera em outros nós, ele faz tudo por você) 5) Na GUI da web, vá para Home, clique em Hue e Hue Web UI. Isso lhe dá acesso ao Hive, Pig, Sqoop etc.

MikeKulls
fonte
As distribuições Cloudera estão muito atrasadas em relação às versões atuais disponíveis para muitos dos pacotes. se você quiser "mais recente e maior", Apache Hadoop é o caminho a percorrer
Nerrve
0

Solução verificada de postagens anteriores:

1) Verifiquei se a libhadoop.so.1.0.0distribuição fornecida com a distribuição Hadoop foi compilada para a arquitetura da minha máquina, que é 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) Adicionado -Djava.library.path=<path>a HADOOP_OPTem hadoop-env.sh:

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

Isso realmente fez o aviso irritante desaparecer.

piiteraq
fonte
0

Em primeiro lugar: você pode modificar a versão glibc. O CentOS fornece softwares seguros tradicionalmente, mas também significa que a versão é antiga, como glibc, protobuf ...

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

Você pode comparar a versão do glibc atual com o glibc necessário.

Segundo: se a versão do glibc atual for antiga, você poderá atualizar o glibc. DownLoad Glibc

Se a versão atual do glibc id estiver correta, você poderá anexar a palavra nativa ao seu HADOOP_OPTS

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

Não estou usando o CentOS. Aqui está o que eu tenho no Ubuntu 16.04.2, hadoop-2.7.3, jdk1.8.0_121. Execute start-dfs.sh ou stop-dfs.sh com sucesso sem erro:

# 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

Substitua / j01 / sys / jdk, / j01 / srv / hadoop pelo caminho da instalação

Também fiz o seguinte para uma instalação única no Ubuntu, que elimina a necessidade de inserir senhas várias vezes ao executar o start-dfs.sh:

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

Substituir usuário pelo seu nome de usuário

Jonathan L
fonte
0

Basicamente, não é um erro, é um aviso no cluster Hadoop. Aqui apenas atualizamos as variáveis ​​de ambiente.

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
fonte