Подтвердить что ты не робот

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/локальные/Hadoop/Library/"

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

Любые идеи?

4b9b3361

Ответ 1

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

В любом случае, это просто предупреждение и не повлияет на функциональность Hadoop.

Вот так, если вы хотите устранить это предупреждение, загрузите исходный код Hadoop и перекомпилируйте libhadoop.so.1.0.0 на 64-битной системе, а затем замените 32-битный.

Здесь перечислены шаги по перекомпиляции исходного кода для Ubuntu:

Удачи.

Ответ 2

Просто добавьте слово native к вашему HADOOP_OPTS следующим образом:

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

PS: Спасибо Searene

Ответ 3

Ответ зависит... Я только что установил Hadoop 2.6 из tarball на 64-bit CentOS 6.6. Установщик Hadoop действительно поставлялся с предварительно построенной 64-битной исходной библиотекой. Для моей установки он находится здесь:

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

И я знаю, что это 64-бит:

[[email protected] 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 у меня есть? Вот простой трюк, чтобы узнать:

[[email protected] hadoop]$ ldd --version
ldd (GNU libc) 2.12

Таким образом, я не могу обновить свою ОС до версии 2.14. Только решение состоит в том, чтобы создавать родные библиотеки из источников в моей ОС или подавлять предупреждение и просто игнорировать его на данный момент. Я решил просто подавить раздражающее предупреждение на данный момент (но планирую строить из источников в будущем), покупая те же параметры ведения журнала, которые мы использовали для получения отладочного сообщения, за исключением того, что теперь просто сделаем уровень ERROR.

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

После непрерывного исследования, предложенного KotiI, была решена проблема.

[email protected]:~$ cd /usr/local/hadoop

[email protected]:/usr/local/hadoop$ ls

bin  include  libexec      logs        README.txt  share
etc  lib      LICENSE.txt  NOTICE.txt  sbin

[email protected]:/usr/local/hadoop$ cd lib

[email protected]:/usr/local/hadoop/lib$ ls
native

[email protected]:/usr/local/hadoop/lib$ cd native/

[email protected]:/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

[email protected]:/usr/local/hadoop/lib/native$ sudo mv * ../

Приветствия

Ответ 7

Для тех, кто находится в 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/

затем обновите hasoop-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"

Ответ 8

@zhutoulala - FWIW ваши ссылки работали для меня с Hadoop 2.4.0, за одним исключением я должен был сказать maven, чтобы не строить javadocs. Я также использовал патч в первой ссылке для 2.4.0, и он работал нормально. Здесь команде maven мне пришлось выпустить

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

После создания и перемещения библиотек не забудьте обновить hasoop-env.sh:)

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

Ответ 9

Это также сработает:

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

Ответ 10

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_HOME/lib/native"

Ответ 11

Переместите файлы скомпилированных исходных файлов в папку $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.

он должен работать.

Ответ 12

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

Ответ 13

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

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

От ответа KunBetter есть деньги

Ответ 14

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

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

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

$ source ~/.bashrc

Ответ 15

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

Ответ 16

В дополнение к принятому ответу @zhutoulala, вот обновление, чтобы заставить его работать с последней стабильной версией на сегодняшний день (2.8) на платформах ARMHF (малина 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/ вы получите более подробную информацию о малине 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) вы должны скопировать и вставить предложенный вами патч 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 install содержимым этого архива. Предупреждающее сообщение при запуске Hadoop должно исчезнуть.

Ответ 17

Для установки Hadoop это намного упрощает установку бесплатной версии от Cloudera. Он поставляется с приятным графическим интерфейсом, который упрощает добавление узлов, нет компиляции или наложения вокруг зависимостей, он поставляется с такими вещами, как улей, свиньи и т.д.

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

Шаги: 1) Загрузить 2) Запустите его 3) Перейти в веб-интерфейс (1.2.3.4:7180) 4) Добавьте дополнительные узлы в веб-gui (НЕ устанавливайте программное обеспечение cloudera на другие узлы, оно делает все для вас) 5) Внутри веб-графического интерфейса перейдите в раздел "Домой", нажмите "Hue" и "Hue Web UI". Это дает вам доступ к Hive, Pig, Sqoop и т.д.

Ответ 18

Проверенное средство от предыдущих сообщений:

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"

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

Ответ 19

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

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

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

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

Если версия текущего glibc-идентификатора права, вы можете добавить собственное слово в свой HADOOP_OPTS

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

Ответ 20

Я не использую 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 [email protected]

Замените пользователя своим именем пользователя