Вопрос-ответ

Hadoop "Unable to load native-hadoop library for your platform" warning

Hadoop "Не удается загрузить встроенную библиотеку hadoop для вашей платформы" предупреждение

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


WARN 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/"


Есть идеи?

Переведено автоматически
Ответ 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-разрядную 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. Единственное решение - создать собственные библиотеки из исходных текстов в моей ОС или подавить предупреждение и просто игнорировать его на данный момент. Я решил пока просто подавить раздражающее предупреждение (но в будущем планирую создавать из исходных текстов), используя те же параметры ведения журнала, которые мы использовали для получения сообщения debug, за исключением того, что теперь просто сделайте его уровнем ОШИБКИ.

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

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

Ответ 4

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

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