Попередження Hadoop "Неможливо завантажити нативну бібліотеку hadoop для вашої платформи"


269

Наразі я налаштовую hadoop на сервері, на якому працює CentO . Під час запуску start-dfs.shабо stop-dfs.shя отримую таку помилку:

УВАГА util.NativeCodeLoader: Не вдається завантажити нативну бібліотеку hadoop для вашої платформи ... використовуючи вбудовані Java-класи, де це можливо

Я працюю Hadoop 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 та, ймовірно, інших версій.
Грег Дубіцький

Документацію щодо використання рідних бібліотек можна знайти на веб-
Джеймс Мур

Відповіді:


227

Я припускаю, що ви працюєте з Hadoop на 64-бітній CentOS. Причина, по якій ви бачили, що попередження - це рідна бібліотека Hadoop, $HADOOP_HOME/lib/native/libhadoop.so.1.0.0насправді була зібрана на 32 біті.

У будь-якому випадку це лише попередження і не вплине на функціональність Hadoop.

Ось так, якщо ви хочете усунути це попередження, завантажте вихідний код Hadoop та перекомпілюйте libhadoop.so.1.0.0 в 64-бітну систему, а потім замініть 32-бітний.

Тут описані кроки щодо перекомпіляції вихідного коду для Ubuntu:

Удачі.


7
Не працює для мене. Дає мені таку ж Неможливу для завантаження нативну бібліотеку hadoop для помилки вашої платформи.
Акшай Хазарі

7
Навіть якщо це точно не працює, все одно корисно. То чи вплине це взагалі на ефективність?
WattsInABox

1
Я використовую той самий hadoop 2.5.0 смол на Centos 7 та Centos 6.5. Обидва - це 64-бітна ОС. Такого попередження у Centos7 немає, але Centos 6.5 дає мені це попередження, чому?
sandip divekar

Дякую. Я не здогадувався, що це попередження. Насправді йдеться про "початковий наномед", а останнє речення - "Неможливо завантажити натовп-хадоп ..", що викликало страх.
Каушик Леле

Зауважте, що вам насправді не потрібно збирати весь Hadoop, як свідчить інструкція - hadoop-common-project/hadoop-commonі hadoop-hdfs-project/hadoop-hdfsцього достатньо.
Грег Дубіцький

152

Просто додайте рідне слово до свого HADOOP_OPTSподібного:

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

PS: Дякую Searene


Це зробив і для мене. На Ubuntu з Hadoop 2.6 шлях був /home/user/hadoop-2.6.0/lib/native
pelazem

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

1
Я думаю, два рішення однакові. За словами doc , java.library.path - це список шляхів пошуку при завантаженні бібліотек. Отже, ви можете експортувати LD_LIBRARY_PATH або використовувати опцію -D у командному рядку java. У командному рядку java і -D <property> = значення дозволяють встановити значення властивості системи.
Hoai-Thu Vuong

54

Відповідь залежить ... Я щойно встановив Hadoop 2.6 з tarball на 64-розрядному CentOS 6.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

Отже, не можу оновити ОС до 2.14. Єдине рішення - створити нативну бібліотеку з джерел на моїй ОС або придушити попередження та просто ігнорувати його поки. Я вирішив просто придушити набридливе попередження (але планувати будувати з джерел у майбутньому) купувати, використовуючи ті самі параметри журналу, які ми використовували для отримання повідомлення про налагодження, за винятком випадків, просто зробіть це на рівні ПОМИЛКИ.

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
Мені довелося додати значення "/ native" до значення HADOOP_OPTS
Ala 'Alnajjar

21

У моєму випадку, після того як я створив hadoop на моїй 64-бітній ОС Linux-монетного двору, я замінив рідну бібліотеку в hadoop/lib. Проблема все ще зберігається. Тоді я зрозумів, що хадоп вказує на те, що він hadoop/libне є hadoop/lib/native. Тому я просто перемістив увесь вміст із рідної бібліотеки до його батьківської. І попередження просто минуло.


Я просто випадково спробував все в мережі. Я втомився і просто очистив усі файли в самій папці lib, тобто файли, складені за допомогою посилань, наведених у відповіді вище. Нарешті, я не знаю, чому, незважаючи на голоси, які ви отримали, я спробував вашу пропозицію, і це спрацювало після напруженої боротьби, яку я поставив на день за все це. або hadoop-env.sh. Дякую тонну.
Акшай Хазарі

Я втомився і просто випорожнив усі власні файли папок у самій папці lib, тобто файли, складені за допомогою посилань, наведених у відповіді вище (рідна папка у новому hadoop-2.4.0-src.tar.gz.)
Акшай Хазарі

15

Це також буде працювати:

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

1
Дякую. Якщо ви заміните LD_LIBRARY_PATH, щоб використати tomcat apr, просто додайте рідний шлях hadoop як `export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: / usr / lib / hadoop / lib / native.
Ерік

це єдине рішення для мене. (спробував усі інші відповіді).
sailfish009

13

Після безперервного дослідження, як запропонував КотіІ, було вирішено питання.

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

Для тих, хто працює на OSX з Hadoop, встановленим через Homebrew, виконайте ці кроки, замінюючи шлях та версію 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

Дякую. У мене є bzip2: false, openssl: false build не підтримує 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 - FWIW ваші посилання працювали на мене з Hadoop 2.4.0, за одним винятком, я повинен був сказати maven, щоб не будувати javadocs. Я також використовував патч у першому посиланні для 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

так, ви повинні перекомпілювати 64-бітну lib / native через ресурс hadoop.
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
Bořice

1

У мене була така ж проблема з JDK6, я змінив JDK на JDK8, проблема вирішена. Спробуйте використовувати JDK8 !!!


1

Окрім прийнятої відповіді @zhutoulala, ось оновлення, щоб вона працювала з останньою стабільною на сьогодні версією (2.8) на платформах ARMHF (Raspberry Pi 3, модель B). По-перше, я можу підтвердити, що ви повинні перекомпілювати власні бібліотеки до 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, але не для версії 2.8 Hadoop.

Ось мої вказівки налити Hadoop 2.8:

  • ще не існує пакета протобуфа на останньому Raspbian, тому його потрібно скласти самостійно, і версія повинна бути точно protobuf 2.5 ( https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz )
  • Метод виправлення файлів CMake необхідно змінити. Moreovere, файли для виправлення не однакові. На жаль, не існує прийнятого виправлення на JIRA, характерного для 2.8. За цією URL-адресою ( https://issues.apache.org/jira/browse/HADOOP-9320 ) ви повинні скопіювати та вставити запропонований патч Andreas Muttscheller у свій 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

Як тільки збірка буде успішною:

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

І замініть вміст lib / native каталогу вашої установки Hadoop на вміст цього архіву. Попереджувальне повідомлення під час запуску Hadoop має зникнути.


0

Для установки Hadoop набагато простіше встановити безкоштовну версію від Cloudera. Він має гарний графічний інтерфейс, який спрощує додавання вузлів, немає компіляції та заповнення залежностей, він постачається з такими речами, як вулик, свиня тощо.

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

Етапи: 1) Завантажити 2) Запустити його 3) Перейти до веб-інтерфейсу інтерфейсу (1.2.3.4:7180) 4) Додати додаткові вузли у веб-інтерфейс (НЕ встановлюйте програмне забезпечення cloudera на інші вузли, це все робить для вас) 5) У веб-графічному інтерфейсі перейдіть на головну, натисніть Hue та Hue Web UI. Це дає вам доступ до вулика, свині, Sqoop тощо.


Дистрибуції Cloudera багато разів відстають від поточних версій, доступних для багатьох пакетів. якщо ви хочете "останнє та
найкраще

0

Перевірений засіб від попередніх публікацій:

1) Перевірив, що libhadoop.so.1.0.0поставлений з розподілом Hadoop був складений для моєї машинної архітектури, що становить 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 традиційно забезпечує безпечні програмні засоби, а також означає, що версія стара, наприклад, glibc, protobuf ...

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

Ви можете порівняти версію поточного glibc з потрібним glibc.

По-друге: Якщо версія поточного glibc стара, ви можете оновити glibc. DownLoad Glibc

Якщо версія поточного id glibc праворуч, ви можете додати слово рідного до свого 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 на шлях встановлення

Я також зробив наступні установки на Ubuntu, що виключає необхідність вводити паролі кілька разів під час запуску 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
 експортувати HADOOP_COMMON_LIB_NATIVE_DIR = "/ usr / local / hadoop / lib / native"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.