하둡“플랫폼에 기본 하둡 라이브러리를로드 할 수 없습니다”경고


269

현재 CentOs를 실행하는 서버에서 hadoop을 구성하고 있습니다 . 내가 실행하는 경우 start-dfs.sh또는 stop-dfs.sh, 나는 다음과 같은 오류가 발생합니다 :

WARN util.NativeCodeLoader : 해당되는 경우 내장 Java 클래스를 사용하여 플랫폼에 대한 기본 하둡 라이브러리를로드 할 수 없습니다.

하둡 2.2.0을 실행하고 있습니다.

온라인으로 검색하면이 링크가 표시됩니다 : http://balanceandbreath.blogspot.ca/2013/01/utilnativecodeloader-unable-to-load.html

그러나 /native/hadoop 2.x 의 디렉토리 내용 이 다르기 때문에 어떻게 해야할지 모르겠습니다.

또한이 두 가지 환경 변수를 추가했습니다 hadoop-env.sh:

export HADOOP_OPTS = "$ HADOOP_OPTS -Djava.library.path = / usr / local / hadoop / lib /"

HADOOP_COMMON_LIB_NATIVE_DIR = "/ usr / local / hadoop / lib / native /"내보내기

어떤 아이디어?


3
검색 가능성 :이 문제는 최소한 Hadoop 2.4.0, Hadoop 2.4.1 및 기타 버전에도 적용됩니다.
Greg Dubicki

기본 라이브러리를 사용하는 방법에 대한 설명서는 hadoop.apache.org/docs/current/hadoop-project-dist/…에 있습니다.
James Moore

답변:


227

64 비트 CentOS에서 Hadoop을 실행한다고 가정합니다. 경고가 네이티브 Hadoop 라이브러리이기 때문에 $HADOOP_HOME/lib/native/libhadoop.so.1.0.0실제로 32 비트로 컴파일 되었기 때문입니다.

어쨌든 이것은 단지 경고 일 뿐이며 하둡의 기능에는 영향을 미치지 않습니다.

이 경고를 없애고 Hadoop의 소스 코드를 다운로드하여 libhadoop.so.1.0.064 비트 시스템에서 다시 컴파일 한 다음 32 비트를 교체 하는 방법은 다음과 같습니다 .

소스 코드를 다시 컴파일하는 방법에 대한 단계는 Ubuntu에 포함되어 있습니다.

행운을 빕니다.


7
나를 위해 작동하지 않습니다. 플랫폼 오류에 대해 동일한 네이티브 하둡 라이브러리를로드 할 수 없습니다.
Akshay Hazari

7
이것이 제대로 작동하지 않더라도 여전히 도움이됩니다. 이것이 성능에 전혀 영향을 미치나요?
WattsInABox

1
Centos 7 및 Centos 6.5에서 동일한 hadoop 2.5.0 tar를 사용하고 있습니다. 둘 다 64 비트 OS입니다. Centos7에는 그러한 경고가 없지만 Centos 6.5는 왜 이런 경고를합니까?
sandip divekar

감사. 나는 그것이 경고라는 것을 몰랐다. 실제로 "namenode 시작"이라고 말하고 마지막 문장은 "native-hadoop ..을 (를)로드 할 수 없습니다."입니다.
Kaushik Lele

실제로 지침 제안으로, 전체 하둡을 컴파일 할 필요는 없습니다 - hadoop-common-project/hadoop-common그리고는 hadoop-hdfs-project/hadoop-hdfs충분하다.
Greg Dubicki

152

다음 과 같이 기본 단어를 추가 HADOOP_OPTS하십시오.

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

PS : Searene 님, 감사합니다 .


이것은 또한 나를 위해 그것을했다. Hadoop 2.6이
설치된

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

1
두 가지 솔루션이 동일하다고 생각합니다. 에 따르면 문서 , java.library.path는 라이브러리를로드 할 때 검색 할 경로의 목록입니다. 따라서 LD_LIBRARY_PATH 를 내보내 거나 java 명령 행에서 -D 옵션을 사용할 수 있습니다 . Java 명령 행 및 -D <property> = value 에서 시스템 특성 값을 설정할 수 있습니다.
Hoai-Thu Vuong

54

대답은 ... 64 비트 CentOS 6.6의 tarball에서 Hadoop 2.6을 설치했습니다. Hadoop 설치에는 실제로 사전 구축 된 64 비트 기본 라이브러리가 제공되었습니다. 내 설치의 경우 다음과 같습니다.

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

그리고 나는 그것이 64 비트라는 것을 알고 있습니다 :

[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)

불행히도, 나는 "이 라이브러리가 32 pr 64 비트입니까?"

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

그래서 교훈은 배웠습니다. 어쨌든, 나머지는 적어도 경고를 억제 할 수있게했습니다. 그래서 나는 HADOOP_OPTS 환경 변수를 사용하여 라이브러리 경로를 제공하기 위해 다른 답변에서 권장되는 모든 것을 사용할 수 없었습니다. 소스 코드를 보았습니다. 오류를 생성하는 모듈은 힌트를 알려줍니다 ( 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

따라서 여기에서 무엇을하는지 확인하십시오.

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

아, 디버그 수준의 로깅이 있습니다. 추가 도움이 필요한지 살펴 보겠습니다. $ HADOOP_CONF_DIR / log4j.properties 파일에 다음 행을 추가하면됩니다.

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

그런 다음 stop-dfs.sh와 같은 원래 경고를 생성하는 명령을 실행 하고이 케이크를 얻었습니다.

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)

그리고이 디버그 메시지의 스 니펫 (이전 ldd 명령이 나에게 말하기 위해 시도한 것과 같은 것)에 답이 있습니다.

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

어떤 GLIBC 버전이 있습니까? 알아내는 간단한 방법은 다음과 같습니다.

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

따라서 OS를 2.14로 업데이트 할 수 없습니다. 유일한 해결책은 내 OS의 소스에서 기본 라이브러리를 작성하거나 경고를 억제하고 지금은 무시하는 것입니다. 나는 지금 당장 귀찮은 경고를 억제하기로 선택했지만 (나중에 소스에서 빌드 할 계획이라면) 디버그 메시지를 얻는 데 사용한 것과 동일한 로깅 옵션을 사용하여 구매하십시오. 지금은 예외입니다.

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

오픈 소스 소프트웨어의 큰 장점은 간단한 논리적 단계를 수행하면 이러한 정보를 파악할 수 있다는 것입니다.


4
이 아름다운 답변에 대해 감사합니다. 나는 대답을 얻었고 그 과정에서 가치있는 것을 배웠다.
dogwynn

26

나는 같은 문제가 있었다. 다음 줄을 추가하면 해결됩니다 .bashrc.

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

5
나는 추가 "/ 기본"HADOOP_OPTS 값으로했다
알라 'Alnajjar에게

21

필자의 경우 64 비트 Linux 민트 OS에서 hadoop을 빌드 한 후의 기본 라이브러리를 교체했습니다 hadoop/lib. 여전히 문제가 지속됩니다. 그런 다음을 가리 키지 hadoop/lib않는 hadoop을 알아 냈습니다 hadoop/lib/native. 그래서 모든 콘텐츠를 기본 라이브러리에서 부모로 옮겼습니다. 그리고 경고는 방금 갔다.


방금 인터넷에서 모든 것을 시도했습니다. 나는 피곤했고 lib 폴더 자체의 모든 파일, 즉 위의 답변에 제공된 링크를 사용하여 컴파일 된 파일을 비 웠습니다. 마지막으로 나는 당신이 얻은 다운 보트에도 불구하고 당신의 제안을 시도한 이유를 모르겠습니다.이 모든 일 뒤에 하루를 보냈다는 엄청난 투쟁 끝에 효과가있었습니다. 또는 hadoop-env.sh. 고마워요
Akshay Hazari

피곤했고 lib 폴더 자체의 모든 기본 폴더 파일, 즉 위의 답변에 제공된 링크를 사용하여 컴파일 된 파일 (새 hadoop-2.4.0-src.tar.gz의 기본 폴더)을 비 웠습니다.
Akshay

15

이것은 또한 작동합니다 :

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

1
감사. tomcat apr을 사용하기 위해 LD_LIBRARY_PATH를 재정의하는 경우 hadoop 기본 경로를`export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH : / usr / lib / hadoop / lib / native로 추가하십시오.
Eric

이것은 나에게만 해결책입니다. (다른 모든 답변을 시도했습니다).
sailfish009

13

Koti가 제안한 지속적인 연구 끝에 문제가 해결되었습니다.

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 * ../

건배


11

Homebrew를 통해 Hadoop이 설치된 OSX 사용자의 경우 다음 단계에 따라 경로 및 Hadoop 버전을 적절하게 대체하십시오.

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/

그런 다음 hadoop-env.sh를

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"

고마워 필립. 이 솔루션은 완벽하게 작동했습니다. 필자의 경우 Djava.library.path 옵션 만 있으면됩니다. 바로 내가 찾던 것이 었습니다. 감사!!!
arcee123 2016 년

bzip2 : false, openssl : false 빌드는 openssl을 지원하지 않습니다. 다른 사람들은 길을 보여줍니다. 어떤 제안이라도.
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"

8

@ zhutoulala-귀하의 링크가 Hadoop 2.4.0에서 저에게 도움이되었습니다. 단, javadoc을 작성하지 말라고 maven에게 말해야했습니다. 또한 2.4.0의 첫 번째 링크에서 패치를 사용했으며 정상적으로 작동했습니다. 여기 내가 발행 해야하는 maven 명령이 있습니다.

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

이것을 빌드하고 라이브러리를 옮긴 후에 hadoop-env.sh를 업데이트하는 것을 잊지 마십시오 :)

이것이 나와 같은 장애물에 부딪친 사람에게 도움이 될 수 있다고 생각했습니다.


5

컴파일 된 기본 라이브러리 파일을 $HADOOP_HOME/lib폴더로 이동하십시오 .

그런 다음 .bashrc파일 을 편집하여 환경 변수를 설정하십시오.

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

컴파일 된 기본 라이브러리 파일이 $HADOOP_HOME/lib폴더에 있는지 확인하십시오 .

작동해야합니다.


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

예, hadoop 리소스를 통해 64 비트 lib / native를 다시 컴파일해야합니다.
KunBetter

2

이 줄은 바로 여기에 있습니다 :

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

KunBetter의 답변에서 저를 위해 일했습니다. .bashrc 파일에 추가하고 .bashrc 내용을 다시로드하십시오.

$ source ~/.bashrc

로컬 시스템에서 hadoop-2.6.0 버전을 사용하고 있습니다. 나는 또한 같은 문제에 직면했다. 그런 다음 hadoop-2.7.1-src를 다운로드하고 바이너리 및 네이티브 라이브러리를 빌드하고 네이티브 라이브러리 hadoop-2.6.0을 새로 빌드 한 네이티브로 바꿨습니다. 그러나 여전히 같은 오류가 발생했습니다. 그런 다음 나는 export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH그것을 위해 일했다.
ParagFlume

1

이 줄은 바로 여기에 있습니다 :

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

KunBetter의 대답은 돈이있는 곳입니다.


내 경우에는 내가 모두 필요 export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH 하고 export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH
borice

1

JDK6과 동일한 문제가 있었고 JDK를 JDK8로 변경했는데 문제가 해결되었습니다. JDK8을 사용해보십시오!


1

@zhutoulala 수락 된 답변 외에도 ARMHF 플랫폼 (Raspberry Pi 3 모델 B)에서 최신 안정 버전 (2.8)으로 작동하도록 업데이트되었습니다. 먼저 네이티브 라이브러리를 64 비트 ARM으로 다시 컴파일해야한다는 것을 확인할 수 있습니다. 일부 환경 변수 설정에 따른 다른 답변은 작동하지 않습니다. Hadoop 문서에 표시된대로 사전 빌드 된 기본 라이브러리는 32 비트입니다.

첫 번째 링크 ( http://www.ercoppa.org/posts/how-to-compile-apache-hadoop-on-ubuntu-linux.html )에 제공된 높은 수준의 단계 가 맞습니다. 이 URL http://www.instructables.com/id/Native-Hadoop-260-Build-on-Pi/ 에서 Raspberry Pi에 대한 자세한 내용을 볼 수 있지만 Hadoop 버전 2.8에는 해당되지 않습니다.

다음은 Hadoop 2.8을 따르는 표시입니다.

  • 최신 Raspbian에는 아직 protobuf 패키지가 없으므로 직접 컴파일해야하며 버전은 정확히 protobuf 2.5 여야합니다 ( https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz )
  • CMake 파일 패치 방법을 변경해야합니다. 또한 패치 할 파일이 동일하지 않습니다. 불행히도 JIRA에는 2.8 전용 패치가 없습니다. 이 URL ( https://issues.apache.org/jira/browse/HADOOP-9320 )에서 Andreas Muttscheller 제안 패치를 복사하여 붙여 넣어야합니다.

    :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

빌드가 성공하면 :

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

그리고 Hadoop 설치의 lib / native 디렉토리 컨텐츠를이 아카이브 컨텐츠로 바꾸십시오. 하둡을 실행할 때 경고 메시지가 사라져야합니다.


0

하둡 설치의 경우 Cloudera에서 무료 버전을 설치하는 것이 훨씬 쉽습니다. 노드를 간단하게 추가 할 수있는 멋진 GUI가 있으며, 종속성으로 컴파일하거나 채우지 않으며 하이브, 돼지 등과 같은 것들이 있습니다.

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

단계 : 1) 다운로드 2) 실행 3) 웹 GUI로 이동 (1.2.3.4:7180) 4) 웹 GUI에 추가 노드 추가 (다른 노드에 cloudera 소프트웨어를 설치하지 마십시오. 5) 웹 GUI 내에서 홈으로 이동하여 색조 및 색조 웹 UI를 클릭하십시오. 이를 통해 Hive, Pig, Sqoop 등에 액세스 할 수 있습니다.


Cloudera 배포는 많은 패키지에서 사용 가능한 현재 버전보다 많은 시간이 소요됩니다. "최신의 최고"를 원한다면 Apache Hadoop이 나아갈 길입니다.
Nerrve

0

이전 게시물에서 확인 된 해결 방법 :

1) libhadoop.so.1.0.0Hadoop 배포판과 함께 제공된 시스템 아키텍처 인 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) 추가 -Djava.library.path=<path>HADOOP_OPT에서 hadoop-env.sh:

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

이로 인해 성가신 경고가 사라졌습니다.


0

첫째 : glibc 버전을 수정할 수 있습니다 .CentOS는 안전한 소프트웨어를 tranditionally 제공합니다. 또한 glibc, protobuf와 같은 오래된 버전을 의미합니다 ...

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

현재 glibc 버전과 필요한 glibc를 비교할 수 있습니다.

둘째 : 현재 glibc 버전이 오래된 경우 glibc를 업데이트 할 수 있습니다. 다운로드 Glibc

현재 glibc id 버전이 맞다면 HADOOP_OPTS에 네이티브 단어를 추가 할 수 있습니다

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

0

CentOS를 사용하지 않습니다. 다음은 Ubuntu 16.04.2, hadoop-2.7.3, jdk1.8.0_121에있는 것입니다. 오류없이 start-dfs.sh 또는 stop-dfs.sh를 성공적으로 실행하십시오.

# 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

/ j01 / sys / jdk, / j01 / srv / hadoop을 설치 경로로 바꾸십시오.

또한 우분투에서 일회성 설정을 위해 다음을 수행하여 start-dfs.sh를 실행할 때 암호를 여러 번 입력 할 필요가 없습니다.

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

사용자를 사용자 이름으로 바꾸십시오


0

기본적으로 오류가 아니며 Hadoop 클러스터의 경고입니다. 여기서는 환경 변수를 업데이트합니다.

export HADOOP_OPTS = "$ HADOOP_OPTS"-Djava.library.path = / usr / local / hadoop / lib
 export HADOOP_COMMON_LIB_NATIVE_DIR = "/ usr / local / hadoop / lib / native"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.