Предупреждение Hadoop "Невозможно загрузить библиотеку native-hadoop для вашей платформы"
В настоящее время я настраиваю 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 /"
Есть идеи?
24 ответа
Я предполагаю, что вы используете Hadoop на 64-битной CentOS. Причина, по которой вы увидели это предупреждение - родная библиотека Hadoop $HADOOP_HOME/lib/native/libhadoop.so.1.0.0
был фактически скомпилирован на 32 бит.
В любом случае, это всего лишь предупреждение, и оно не повлияет на функциональность Hadoop.
Если вы хотите устранить это предупреждение, загрузите исходный код Hadoop и перекомпилируйте его. libhadoop.so.1.0.0
в 64-битной системе, затем замените 32-битную.
Шаги о том, как перекомпилировать исходный код, включены здесь для Ubuntu:
Удачи.
Просто добавьте слово родной к вашему HADOOP_OPTS
как это:
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native"
PS: спасибо Searene
Ответ зависит... Я только что установил 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
Итак, чтобы посмотреть, что он делает:
Ах, есть некоторая регистрация уровня отладки - давайте обратимся к этому, посмотрим, получим ли мы дополнительную помощь. Это делается путем добавления следующей строки в файл $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
Я надеюсь, что это поможет другим понять, что большое преимущество программного обеспечения с открытым исходным кодом заключается в том, что вы можете разобраться в этом, если предпримете несколько простых логических шагов.
Я была такая же проблема. Это решается добавлением следующих строк в .bashrc
:
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
В моем случае после сборки hadoop на моей 64-битной ОС Linux mint я заменил собственную библиотеку в hadoop/lib
, Тем не менее проблема сохраняется. Тогда я разобрался с хадопом, указывающим на hadoop/lib
не для hadoop/lib/native
, Поэтому я просто переместил весь контент из нативной библиотеки в ее родительский. И предупреждение просто исчезло.
Это также будет работать:
export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native
После продолжительного исследования, предложенного Коти, проблема была решена.
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 * ../
ура
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"
Для тех, кто работает на 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"
@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:)
Подумал, что это может помочь кому-то, кто столкнулся с теми же препятствиями, что и я
Переместите файлы скомпилированной нативной библиотеки в $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
папка.
он должен работать.
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
Эта строка прямо здесь:
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
Из ответа KunBetter, работал на меня. Просто добавьте его в файл.bashrc и перезагрузите содержимое.bashrc
$ source ~/.bashrc
В дополнение к принятому ответу @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) вы должны скопировать и вставить предложенный Андреасом Мутчеллером патч в свой наменоде:
: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 должно исчезнуть.
У меня была та же проблема с JDK6, я изменил JDK на JDK8, проблема решена. Попробуйте использовать JDK8!!!
Этот ответ представляет собой смесь анализа @chromeeagle и этой ссылки (Nan-Xiao).
Для тех, у кого другие решения просто не работают, выполните следующие действия:
Отредактируйте файл
$HADOOP_HOME/etc/hadoop/log4j.properties
(кредиты @chromeeagle). Добавьте строку в конце:log4j.logger.org.apache.hadoop.util.NativeCodeLoader=DEBUG
Запустите оболочку Spark / Pyspark. Вы увидите дополнительную информацию журнала о том, что собственная библиотека не загружается. В моем случае у меня была ошибка:
Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: no hadoop in java.library.path
Чтобы решить эту конкретную проблему, добавьте библиотеку Hadoop в
LD_LIBRARY_PATH
переменная окружения в вашем профиле пользователя:export LD_LIBRARY_PATH="$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH"
Надеюсь это поможет. У меня была эта проблема в нескольких установках HADOOP, она работала на обоих.
Эта строка прямо здесь:
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
От KunBetter ответ, где деньги
По сути, это не ошибка, это предупреждение в кластере Hadoop. Здесь мы просто обновляем переменные среды.
экспорт HADOOP_OPTS = "$HADOOP_OPTS"-Djava.library.path = /usr/local/hadoop/lib
экспорт HADOOP_COMMON_LIB_NATIVE_DIR = "/usr/local/hadoop/lib/native"
Я не использую 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
Замените пользователя вашим именем пользователя
Проверенное средство от предыдущих сообщений:
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"
Это действительно заставило исчезнуть надоедливое предупреждение.
Во-первых: вы можете изменить версию 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"
Добавлена собственная библиотека Hadoop в LD_LIBRARY_PATH в файле .bashrc и перезагружена библиотека в текущий сеанс с использованием исходного кода ~/.bashrc.
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
(ИЛИ) Если у вас установлена библиотека hadoop в /usr/lib/
export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native
Для установки 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 и т. Д.
Собственная библиотека hadoop поддерживается только на платформах *nix. Библиотека не работает с Cygwin или платформой Mac OS X.
Ссылки: https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/NativeLibraries.html
Если вы используете Windows или Mac OS X, вам необходимо изменить платформу на *nix.