Предупреждение Hadoop «Невозможно загрузить библиотеку native-hadoop для вашей платформы»

269

В настоящее время я настраиваю hadoop на сервере под управлением CentOs . Когда я запускаю start-dfs.shили stop-dfs.sh, я получаю следующую ошибку:

WARN util.NativeCodeLoader: невозможно загрузить библиотеку native-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 /"

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

Любые идеи?

Ольшанской
источник
3
Для поиска: эта проблема также относится по крайней мере к Hadoop 2.4.0, Hadoop 2.4.1 и, возможно, к другим версиям.
Грег Дубицки,
Документация о том, как использовать нативные библиотеки, находится по адресу hadoop.apache.org/docs/current/hadoop-project-dist/…
Джеймс Мур,

Ответы:

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:

Удачи.

zhutoulala
источник
7
Не работает для меня Дает мне то же самое Невозможно загрузить библиотеку native-hadoop для вашей ошибки платформы.
Акшай Хазари
7
Даже если это не совсем работает, это все равно полезно. Так повлияет ли это на производительность?
WattsInABox
1
Я использую ту же смолу hadoop 2.5.0 на Centos 7 и Centos 6.5. Оба являются 64-битными ОС. На Centos7 такого предупреждения нет, но Centos 6.5 дает мне это предупреждение, почему?
Sandip Divekar
Спасибо. Я не понял, что это предупреждение. На самом деле говорит «начальный наменоде», а последнее предложение «Невозможно загрузить native-hadoop ..», что вызвало страх.
Каушик Леле
Обратите внимание, что вам на самом деле не нужно компилировать весь 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

Hoai-Thu Vuong
источник
Это сделало это и для меня. В 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
Я думаю, два решения одинаковы. Согласно документу , java.library.path - это список путей для поиска при загрузке библиотек. Таким образом, вы можете экспортировать LD_LIBRARY_PATH или использовать опцию -D в командной строке Java. В командной строке Java и -D <свойство> = значение позволяют нам установить значение системного свойства.
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 или 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

Я надеюсь, что это поможет другим понять, что большое преимущество программного обеспечения с открытым исходным кодом состоит в том, что вы можете разобраться в этом, если предпримете несколько простых логических шагов.

chromeeagle
источник
4
Спасибо, сэр за этот прекрасно подробный ответ. Я получил свой ответ и узнал кое-что ценное (несколько вещей) в процессе.
Dogwynn
26

Я была такая же проблема. Это решается добавлением следующих строк .bashrc:

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
Neeraj
источник
5
Мне пришлось добавить "/ native" к значению HADOOP_OPTS
Ala 'Alnajjar
21

В моем случае после сборки hadoop на моей 64-битной ОС Linux mint я заменил встроенную библиотеку в hadoop/lib. Тем не менее проблема сохраняется. Тогда я разобрался с хэдупом, указывающим hadoop/libне на hadoop/lib/native. Поэтому я просто переместил весь контент из нативной библиотеки в ее родительский. И предупреждение просто исчезло.

коти
источник
Я просто перепробовал все в сети. Я устал и просто опустошил все файлы в самой папке lib, т.е. те, которые были скомпилированы по ссылкам, приведенным в ответе выше. Наконец, я не знаю, почему, несмотря на ваши отрицательные голоса, я попробовал ваше предложение, и оно сработало после огромной борьбы, которую я потратил на целый день за всем этим. Не имело значения, изменил ли я расположение собственной библиотеки в .bashrc или 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, сборка не поддерживает openssl. У других есть путь, показывающий. Какие-либо предложения.
ггорантл
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
источник
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 :)

Подумал, что это может помочь кому-то, кто столкнулся с теми же препятствиями, что и я

user2229544
источник
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
KunBetter
источник
да, вам нужно перекомпилировать 64-битную библиотеку lib / native через ресурс hadoop.
KunBetter
2

Эта строка прямо здесь:

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

Из ответа KunBetter, работал на меня. Просто добавьте его в файл .bashrc и перезагрузите содержимое .bashrc

$ source ~/.bashrc
BeingSachin
источник
Я использую версию 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 !!!

MangoJo
источник
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 ), являются правильными. По этому адресу 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 ) вы должны скопировать и вставить предложенный Андреасом Мутчеллером патч в ваш 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 должно исчезнуть.

mattt
источник
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. Это дает вам доступ к Hive, Pig, Sqoop и т. Д.

MikeKulls
источник
Дистрибутивы 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"

Это действительно заставило исчезнуть надоедливое предупреждение.

piiteraq
источник
0

Во-первых: вы можете изменить версию glibc. CentOS предоставляет безопасные программы традиционно, это также означает, что версия старая, такая как glibc, protobuf ...

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

Вы можете сравнить версию текущего glibc с необходимым glibc.

Во-вторых: если версия текущего glibc старая, вы можете обновить glibc. DownLoad Glibc

Если версия текущего идентификатора glibc верна, вы можете добавить слово native к вашему 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
 export HADOOP_COMMON_LIB_NATIVE_DIR = "/ usr / local / hadoop / lib / native"
Спандана р
источник