Hadoop “Não é possível carregar a biblioteca nativa do hadoop para sua plataforma”

No momento, estou configurando o hadoop em um servidor que executa o CentOS . Quando executo start-dfs.sh ou stop-dfs.sh , recebo o seguinte erro:

WARN util.NativeCodeLoader: Não é possível carregar a biblioteca native-hadoop para sua plataforma … usando classs java embutidas onde aplicável

Estou executando o Hadoop 2.2.0.

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

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

Eu também adicionei estas duas variables ​​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?

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

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

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

    Passos sobre como recompilar o código-fonte estão incluídos aqui para o Ubuntu:

    Boa sorte.

    Basta append uma palavra nativa ao seu HADOOP_OPTS desta forma:

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

    PS: Obrigado Searene

    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 de 64 bits pré-configurada. 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, eu estupidamente esqueci a resposta ali mesmo olhando para mim enquanto eu estava focado, “Esta biblioteca é 32 bits de 64 bits?”:

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

    Então, lição aprendida. De qualquer forma, o resto, pelo menos, me levou a ser capaz de suprimir o aviso. Então continuei e fiz tudo o que era recomendado nas outras respostas para fornecer o caminho da biblioteca usando a variável de ambiente HADOOP_OPTS sem sucesso. Então eu olhei para 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 classs where applicable 

    Então, aqui para ver o que faz:

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

    Ah, há algum log de nível de debugging – vamos transformar isso em um ver se conseguirmos alguma ajuda adicional. Isso é feito incluindo a seguinte linha no arquivo $ HADOOP_CONF_DIR / log4j.properties:

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

    Então eu corri um comando que gera o aviso original, como stop-dfs.sh, e recebi este goodie:

     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 debugging (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 

    Então, não posso atualizar meu sistema operacional para 2.14. A única solução é criar as bibliotecas nativas a partir de fonts no meu sistema operacional ou suprimir o aviso e ignorá-lo por enquanto. Eu optei apenas para suprimir o aviso irritante por agora (mas planeje construir a partir de fonts no futuro) comprar usando as mesmas opções de registro que usamos para obter a mensagem de debugging, exceto agora, apenas torná-lo nível de erro.

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

    Espero que isso ajude os outros a verem que um grande benefício do software de código aberto é que você pode descobrir essas coisas se você seguir alguns passos lógicos simples.

    Eu tive o mesmo problema. Está resolvido adicionando as seguintes linhas no .bashrc :

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

    No meu caso, depois de construir o hadoop no meu sistema operacional Linux de 64 bits, substituí a biblioteca nativa no hadoop/lib . Ainda o problema persiste. Então eu descobri o hadoop apontando para hadoop/lib não para o hadoop/lib/native . Então eu mudei todo o conteúdo da biblioteca nativa para seu pai. E o aviso acabou.

    Depois de uma pesquisa contínua, como sugerido por KotiI, 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

    Isso também funcionaria:

     export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native 

    Para aqueles que estão no OSX com o Hadoop instalado 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/ 

    em seguida, 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" 

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

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

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

    Pensei que isso poderia ajudar alguém que correu para os mesmos obstáculos que eu

     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" 

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

    Em seguida, defina suas variables ​​de ambiente editando o arquivo .bashrc

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

    Certifique-se de que seus arquivos de biblioteca nativa compilados estejam na pasta $HADOOP_HOME/lib .

    deve funcionar.

     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 

    Esta linha aqui mesmo:

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

    Da resposta do KunBetter é onde o dinheiro é

    Esta linha aqui mesmo:

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

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

     $ source ~/.bashrc 

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

    Além de @zhutoulala resposta aceita, aqui está uma atualização para fazê-lo funcionar com a última versão estável até à data (2.8) em 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 variables ​​de ambiente, não funcionarão. Conforme indicado na documentação do Hadoop, as bibliotecas nativas pré-construídas são de 32 bits.

    Os passos de alto nível dados no primeiro link ( http://www.ercoppa.org/posts/how-to-compile-apache-hadoop-on-ubuntu-linux.html ) estão corretos. Nesta url http://www.instructables.com/id/Native-Hadoop-260-Build-on-Pi/ você obtém mais detalhes específicos do Raspberry Pi, mas não do Hadoop versão 2.8.

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

    • ainda não há pacote protobuf no último Raspbian, então você deve compilá-lo você mesmo 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 do arquivo CMake deve ser alterado. Mais, os arquivos para patch não são os mesmos. Infelizmente, não há nenhum patch aceito no JIRA específico para 2.8. Neste URL ( https://issues.apache.org/jira/browse/HADOOP-9320 ) você deve copiar e colar o patch proposto por Andreas Muttscheller em seu 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 

    Uma vez que a compilation é 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 de sua instalação do Hadoop pelo conteúdo deste archive. A mensagem de aviso ao executar o Hadoop deve desaparecer.

    Para instalar o Hadoop, é muito mais fácil instalar a versão gratuita do Cloudera. Ele vem com uma interface gráfica que simplifica a adição de nós, não há compilation ou recheio com dependencies, vem com coisas como hive, porco etc.

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

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

    Remédio confirmado de postagens anteriores:

    1) libhadoop.so.1.0.0 que o libhadoop.so.1.0.0 fornecido com a distribuição do Hadoop foi compilado para a minha arquitetura de 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= para HADOOP_OPT em 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.

    Em primeiro lugar: Você pode modificar a versão glibc.CentOS fornece softwares seguros tranditionally, isso 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 é antiga, você pode atualizar o glibc. DownLoad Glibc

    Se a versão do ID atual da glibc estiver correta, você pode append uma 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" 

    Eu 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 seu caminho de instalação

    Eu também fiz o seguinte para configurar uma vez no Ubuntu, o que elimina a necessidade de inserir senhas por várias vezes ao executar start-dfs.sh:

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

    Substitua o usuário pelo seu nome de usuário