Предупреждение 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

Итак, чтобы посмотреть, что он делает:

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

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

Я была такая же проблема. Это решается добавлением следующих строк в .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).

Для тех, у кого другие решения просто не работают, выполните следующие действия:

  1. Отредактируйте файл $HADOOP_HOME/etc/hadoop/log4j.properties(кредиты @chromeeagle). Добавьте строку в конце:

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

  2. Запустите оболочку Spark / Pyspark. Вы увидите дополнительную информацию журнала о том, что собственная библиотека не загружается. В моем случае у меня была ошибка:

    Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: no hadoop in java.library.path

  3. Чтобы решить эту конкретную проблему, добавьте библиотеку 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.

Другие вопросы по тегам