Ostrzeżenie Hadoop „Nie można załadować natywnej biblioteki hadoop dla Twojej platformy”


269

Obecnie konfiguruję hadoop na serwerze z uruchomionymi CentO . Po uruchomieniu start-dfs.shlub stop-dfs.shpojawia się następujący błąd:

OSTRZEŻENIE util.NativeCodeLoader: Nie można załadować natywnej biblioteki hadoop dla Twojej platformy ... używając wbudowanych klas Java w stosownych przypadkach

Korzystam z Hadoop 2.2.0.

Wyszukiwanie online wywołało ten link: http://balanceandbreath.blogspot.ca/2013/01/utilnativecodeloader-unable-to-load.html

Jednak zawartość /native/katalogu na Hadoop 2.x wydaje się być inna, więc nie jestem pewien, co robić.

Dodałem również te dwie zmienne środowiskowe w hadoop-env.sh:

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

eksportuj HADOOP_COMMON_LIB_NATIVE_DIR = "/ usr / local / hadoop / lib / native /"

Jakieś pomysły?


3
W celu przeszukiwania: ten problem dotyczy również co najmniej Hadoop 2.4.0, Hadoop 2.4.1 i prawdopodobnie innych wersji.
Greg Dubicki,

Dokumentacja dotycząca korzystania z bibliotek natywnych znajduje się na stronie hadoop.apache.org/docs/current/hadoop-project-dist/…
James Moore,

Odpowiedzi:


227

Zakładam, że używasz Hadoop na 64-bitowym CentOS. Powodem, dla którego zobaczyłeś to ostrzeżenie, jest natywna biblioteka Hadoop, która $HADOOP_HOME/lib/native/libhadoop.so.1.0.0została skompilowana w wersji 32-bitowej.

W każdym razie jest to tylko ostrzeżenie i nie wpłynie na funkcjonalność Hadoop.

Oto sposób, jeśli chcesz wyeliminować to ostrzeżenie, pobierz kod źródłowy Hadoop i ponownie skompiluj libhadoop.so.1.0.0system 64-bitowy, a następnie zastąp 32-bitowy.

Kroki dotyczące sposobu ponownej kompilacji kodu źródłowego znajdują się tutaj dla Ubuntu:

Powodzenia.


7
Nie działa dla mnie. Daje mi to samo Nie można załadować natywnej biblioteki hadoop dla błędu platformy.
Akshay Hazari

7
Nawet jeśli to nie zadziała, nadal jest pomocne. Czy w ogóle wpłynie to na wydajność?
WattsInABox

1
Używam tej samej tar Hadoop 2.5.0 na Centos 7 i Centos 6.5. Oba są 64-bitowym systemem operacyjnym. Nie ma takiego ostrzeżenia na Centos7, ale Centos 6.5 daje mi to ostrzeżenie, dlaczego?
sandip divekar

Dzięki. Nie zdawałem sobie sprawy, że to ostrzeżenie. W rzeczywistości mówi „początkowy węzeł”, a ostatnie zdanie brzmi „Nie można załadować native-hadoop ..”, co wywołało strach.
Kaushik Lele,

Pamiętaj, że tak naprawdę nie musisz kompilować całego Hadoopa, jak sugerują instrukcje - hadoop-common-project/hadoop-commoni hadoop-hdfs-project/hadoop-hdfswystarczy.
Greg Dubicki,

152

Wystarczy dołączyć słowo natywne do swojego w HADOOP_OPTSten sposób:

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

PS: Dziękuję Searene


Zrobiło to także dla mnie. W systemie Ubuntu z Hadoop 2.6 ścieżka była /home/user/hadoop-2.6.0/lib/native
pelazem

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

1
Myślę, że dwa rozwiązania są takie same. Według doc , java.library.path to lista ścieżek do przeszukania podczas ładowania bibliotek. Aby można było wyeksportować LD_LIBRARY_PATH lub użyć opcji -D w wierszu polecenia Java. W wierszu komend java i -D <właściwość> = wartość pozwala nam ustawić wartość właściwości systemowej.
Hoai-Thu Vuong

54

Odpowiedź zależy ... Właśnie zainstalowałem Hadoop 2.6 z tarball na 64-bitowym CentOS 6.6. Rzeczywiście, instalacja Hadoop rzeczywiście zawierała 64-bitową bibliotekę natywną. Do mojej instalacji jest tutaj:

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

I wiem, że to 64-bit:

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

Niestety, głupio przeoczyłem odpowiedź, patrząc mi prosto w twarz, kiedy skupiłem się na: „Czy ta biblioteka ma 32 wersje na 64-bit?”:

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

Tak, wyciągnięta lekcja. Zresztą reszta przynajmniej doprowadziła mnie do tego, że mogłem stłumić ostrzeżenie. Kontynuowałem więc i zrobiłem wszystko, co było zalecane w innych odpowiedziach, aby podać ścieżkę biblioteki przy użyciu zmiennej środowiskowej HADOOP_OPTS bezskutecznie. Spojrzałem na kod źródłowy. Moduł generujący błąd podaje podpowiedź ( 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

Przejdźmy tutaj, aby zobaczyć, co robi:

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

Ach, jest pewne rejestrowanie na poziomie debugowania - włączmy to, aby zobaczyć, czy otrzymamy dodatkową pomoc. Odbywa się to poprzez dodanie następującego wiersza do pliku $ HADOOP_CONF_DIR / log4j.properties:

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

Następnie uruchomiłem polecenie, które generuje oryginalne ostrzeżenie, takie jak stop-dfs.sh, i otrzymałem ten gadżet:

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)

Odpowiedź znajduje się w tym fragmencie komunikatu debugowania (to samo, co poprzednia komenda ldd „próbowała” powiedzieć:

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

Jaką wersję GLIBC posiadam? Oto prosta sztuczka, aby dowiedzieć się:

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

Nie mogę więc zaktualizować mojego systemu operacyjnego do wersji 2.14. Jedynym rozwiązaniem jest zbudowanie bibliotek natywnych ze źródeł w moim systemie operacyjnym lub zniesienie ostrzeżenia i zignorowanie go na razie. Zdecydowałem się po prostu powstrzymać irytujące ostrzeżenie (ale planuję budować ze źródeł w przyszłości) kup za pomocą tych samych opcji rejestrowania, których użyliśmy, aby uzyskać komunikat debugowania, z wyjątkiem teraz, po prostu ustaw go na poziomie BŁĘDU.

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

Mam nadzieję, że dzięki temu inni zauważą, że dużą zaletą oprogramowania open source jest to, że można to rozgryźć, wykonując proste logiczne kroki.


4
Dziękuję panu za tę pięknie szczegółową odpowiedź. Otrzymałem odpowiedź i nauczyłem się w tym czasie czegoś cennego (kilka rzeczy).
dogwynn

26

Miałem ten sam problem. Rozwiązuje się to poprzez dodanie następujących wierszy .bashrc:

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

5
Musiałem dodać „/ native” do wartości HADOOP_OPTS
Ala 'Alnajjar

21

W moim przypadku po skompilowaniu hadoopa na moim 64-bitowym systemie operacyjnym Linux, zastąpiłem bibliotekę natywną w hadoop/lib. Problem nadal występuje. Potem zorientowałem się, że hadoop wskazuje na hadoop/libnie hadoop/lib/native. Właśnie przeniosłem całą zawartość z rodzimej biblioteki do jej rodzica. I ostrzeżenie właśnie zniknęło.


Właśnie próbowałem wszystkiego w sieci. Zmęczyłem się i po prostu opróżniłem wszystkie pliki w samym folderze lib, tj. Te skompilowane za pomocą łączy podanych w powyższej odpowiedzi. W końcu nie wiem, dlaczego pomimo negatywnych opinii wypróbowałem twoją sugestię i zadziałała po ogromnej walce, którą postawiłem na jeden dzień za tym wszystkim. Nie miało znaczenia, czy zmieniłem lokalizację biblioteki natywnej w .bashrc lub hadoop-env.sh. Dzięki za tonę.
Akshay Hazari

Zmęczyłem się i po prostu opróżniłem wszystkie natywne pliki folderów w samym folderze lib, tj. Te skompilowane za pomocą łączy podanych w powyższej odpowiedzi (natywny folder w nowym hadoop-2.4.0-src.tar.gz.)
Akshay Hazari

15

To również działałoby:

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

1
Dzięki. Jeśli zastąpisz LD_LIBRARY_PATH w celu użycia tomcat apr, po prostu dołącz ścieżkę natywną hadoop jako `export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: / usr / lib / hadoop / lib / native.
Eric,

to działa tylko dla mnie rozwiązanie. (wypróbowałem wszystkie inne odpowiedzi).
sailfish009

13

Po ciągłych badaniach, jak sugeruje Koti, udało mi się rozwiązać problem.

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

Twoje zdrowie


11

W przypadku OSX z Hadoop zainstalowanym przez Homebrew, wykonaj następujące kroki, zastępując ścieżkę i wersję Hadoop, gdzie to stosowne

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/

następnie zaktualizuj hadoop-env.sh za pomocą

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"

Dzięki Philip. To rozwiązanie działało idealnie. W moim przypadku potrzebowałem tylko opcji Djava.library.path. Właśnie tego szukałem. Dzięki!!!
arcee123

Wielkie dzięki. Mam bzip2: false, openssl: false build nie obsługuje openssl. Inni mają ścieżkę, która się pokazuje. Jakieś sugestie.
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 - FWIW twoje linki działały dla mnie z Hadoop 2.4.0 z jednym wyjątkiem, że musiałem powiedzieć maven, żeby nie budował javadocs. Użyłem również łatki w pierwszym linku do wersji 2.4.0 i działała dobrze. Oto polecenie maven, które musiałem wydać

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

Po zbudowaniu tego i przeniesieniu bibliotek nie zapomnij zaktualizować hadoop-env.sh :)

Pomyślałem, że to może pomóc komuś, kto wpadł na te same blokady na drodze co ja


5

Przenieś skompilowane pliki biblioteki natywnej do $HADOOP_HOME/lib folderu.

Następnie ustaw zmienne środowiskowe, edytując .bashrcplik

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

Upewnij się, że Twoje skompilowane natywne pliki bibliotek znajdują się w $HADOOP_HOME/lib folderze.

powinno działać.


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

tak, powinieneś skompilować 64-bitową bibliotekę lib / native poprzez zasób hadoop.
KunBetter

2

Ta linia tutaj:

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

Z odpowiedzi KunBettera działało dla mnie. Wystarczy dołączyć go do pliku .bashrc i ponownie załadować zawartość .bashrc

$ source ~/.bashrc

Używam wersji Hadoop-2.6.0 w moim systemie lokalnym. Miałem również do czynienia z tym samym problemem. Następnie pobrałem hadoop-2.7.1-src i zbudowałem biblioteki binarne i natywne, a także zastąpiłem natywne biblioteki hadoop-2.6.0 nowo zbudowanymi natywnymi. Ale wciąż otrzymywałem te same błędy. Potem ja export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATHi to zadziałało dla mnie.
ParagFlume

1

Ta linia tutaj:

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

Z odpowiedzi KunBettera wynika, gdzie są pieniądze


W moim przypadku potrzebowałem zarówno: export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH i export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH
borice

1

Miałem ten sam problem z JDK6, zmieniłem JDK na JDK8, problem rozwiązany. Spróbuj użyć JDK8 !!!


1

Oprócz zaakceptowanej odpowiedzi @zhutoulala, tutaj jest aktualizacja, aby działała z najnowszą stabilną wersją do tej pory (2.8) na platformach ARMHF (Raspberry Pi 3 model B). Najpierw mogę potwierdzić, że musisz ponownie skompilować biblioteki natywne do 64-bitowego ARM, inne odpowiedzi tutaj oparte na ustawianiu niektórych zmiennych środowiskowych nie będą działać. Jak wskazano w dokumentacji Hadoop, wstępnie wbudowane biblioteki natywne są 32-bitowe.

Kroki wysokiego poziomu podane w pierwszym linku ( http://www.ercoppa.org/posts/how-to-compile-apache-hadoop-on-ubuntu-linux.html ) są poprawne. Na tym adresie URL http://www.instructables.com/id/Native-Hadoop-260-Build-on-Pi/ można więcej szczegółowych informacji dotyczących Raspberry Pi, ale nie dla Hadoop w wersji 2.8.

Oto moje wskazania dotyczące Hadoop 2.8:

  • wciąż nie ma pakietu protobuf w najnowszej wersji Raspbian, więc musisz go skompilować samodzielnie, a wersja musi być dokładnie protobuf 2.5 ( https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz )
  • CMake metoda łatania plików musi zostać zmieniona. Co więcej, pliki do poprawienia nie są takie same. Niestety nie ma akceptowanej łaty na JIRA specyficznej dla 2.8. Pod tym adresem URL ( https://issues.apache.org/jira/browse/HADOOP-9320 ) musisz skopiować i wkleić proponowaną poprawkę Andreasa Muttschellera na swoim węźle nazw:

    :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

Gdy kompilacja się powiedzie:

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

I zamień zawartość katalogu lib / native swojej instalacji Hadoop na zawartość tego archiwum. Komunikat ostrzegawczy po uruchomieniu Hadoop powinien zniknąć.


0

Instalacja Hadoopa jest o wiele łatwiejsza, instalując darmową wersję Cloudera. Jest wyposażony w ładny interfejs GUI, który ułatwia dodawanie węzłów, nie ma kompilacji ani upychania się z zależnościami, jest wyposażony w takie rzeczy jak ul, świnia itp.

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

Kroki to: 1) Pobierz 2) Uruchom 3) Przejdź do GUI sieci (1.2.3.4:7180) 4) Dodaj dodatkowe węzły w GUI sieci (NIE instaluj oprogramowania cloudera na innych węzłach, robi to za Ciebie) 5) W internetowym interfejsie GUI przejdź do strony głównej, kliknij opcję Hue i Hue Web UI. To daje dostęp do Hive, Pig, Sqoop itp.


Dystrybucje Cloudera są wielokrotnie w tyle za aktualnymi wersjami dostępnymi dla wielu pakietów. jeśli chcesz „najnowszy i największy”, Apache Hadoop jest najlepszym rozwiązaniem
Nerrve

0

Zweryfikowane rozwiązanie z wcześniejszych wpisów:

1) Sprawdziłem, czy libhadoop.so.1.0.0dostarczona z dystrybucją Hadoop została skompilowana dla mojej architektury maszyny, czyli 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) Dodane -Djava.library.path=<path>do HADOOP_OPTw hadoop-env.sh:

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

To rzeczywiście sprawiło, że irytujące ostrzeżenie zniknęło.


0

Po pierwsze: możesz zmodyfikować wersję glibc. CENTOS zapewnia bezpieczne oprogramowanie trójwymiarowo, co oznacza również, że wersja jest stara, taka jak glibc, protobuf ...

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

Możesz porównać wersję aktualnego glibc z potrzebnym glibc.

Po drugie: Jeśli wersja obecnego glibc jest stara, możesz zaktualizować glibc. DownLoad Glibc

Jeśli wersja bieżącego glibc jest odpowiednia, możesz dołączyć słowo natywne do swojego HADOOP_OPTS

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

0

Nie używam CentOS. Oto, co mam w Ubuntu 16.04.2, hadoop-2.7.3, jdk1.8.0_121. Uruchom start-dfs.sh lub stop-dfs.sh bez błędu:

# 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

Zamień / j01 / sys / jdk, / j01 / srv / hadoop na ścieżkę instalacji

Wykonałem również następujące czynności w przypadku jednorazowej instalacji na Ubuntu, co eliminuje konieczność wielokrotnego wprowadzania haseł podczas uruchamiania pliku start-dfs.sh:

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

Zastąp użytkownika swoją nazwą użytkownika


0

Zasadniczo nie jest to błąd, to ostrzeżenie w klastrze Hadoop. Tutaj tylko aktualizujemy zmienne środowiskowe.

export HADOOP_OPTS = "$ HADOOP_OPTS" -Djava.library.path = / usr / local / hadoop / lib
 eksportuj HADOOP_COMMON_LIB_NATIVE_DIR = "/ usr / local / hadoop / lib / native"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.