Unable to load native-hadoop library for your platform(已解決)


1、增加調試信息尋找問題

2、兩種方式解決unable to load native-hadoop library for you platform

附:libc/glibc/glib簡介

 

參考:

1、http://my.oschina.net/swuly302/blog/515853【66號公路: Hadoop Unable to load­ ­n­­ati­v­e­-­h­a­­d­o­o­­p library for your platform】

2、http://blog.sina.com.cn/s/blog_4eca88390102vn86.html

 

增加調試信息尋找問題

在執行hdfs命令時,會有一個警告:

WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

我們增加調試信息看問題出在了哪里。

增加調試信息有兩種方式,

1、在執行命令前加一條如下命令:

export HADOOP_ROOT_LOGGER=DEBUG,console

比如:

[wangqi@node001 ~]$ export HADOOP_ROOT_LOGGER=DEBUG,console

[wangqi@node001 ~]$ hdfs dfs -ls /

2、在$HADOOP_CONF_DIR/log4j.properties(hadoop2.6.0的路徑是/home/wangqi/softwar­e­­/­hadoop-2.6.0/etc/hadoop/log4j.properties)文件中添加如下代碼:

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

我選擇的是第二種(因為后面的一種解決方案也需要動這個文件)。

然后執行一條命令,查看調試信息,如下:

[wangqi@node001 ~]$ hdfs dfs -ls /

16/01/05 15:05:49 DEBUG util.NativeCodeLoader: Trying to load the custom-built native-hadoop library...

16/01/05 15:05:49 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: no hadoop in java.library.path

16/01/05 15:05:49 DEBUG util.NativeCodeLoader: java.library.path=/home/wangqi/softwar­e/hadoop-2.6.0/lib

16/01/05 15:05:49 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

Found 1 items

drwxr-xr-x - wangqi supergroup 0 2016-01-05 10:07 /user

問題出來了。對於這個問題,網上有的解決方案是加兩個軟鏈接,即:

ln -s libhadoop.so.1.0.0 libhadoop.so

ln -s libhdfs.so.0.0.0 libhdfs.so

但我加上了這兩個軟鏈接,問題依舊。

兩種方式解決unable to load native-hadoop library for you platform

我們查看一下libhadoop.so.1.0.0的glibc版本,如下:

[wangqi@node001 native]$ ldd libhadoop.so

./libhadoop.so: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./libhadoop.so)

linux-vdso.so.1 => (0x00007fffb53ff000)

libdl.so.2 => /lib64/libdl.so.2 (0x00007fbb73129000)

libc.so.6 => /lib64/libc.so.6 (0x00007fbb72d94000)

/lib64/ld-linux-x86-64.so.2 (0x000000399b800000)

問題其實已經出現了,libhadoop.so需要的glibc版本是glibc_2.14,沒有找到。

我們再看一下當前系統的glibc版本,如下:

[wangqi@node001 native]$ ldd --version

ldd (GNU libc) 2.12

Copyright (C) 2010 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Written by Roland McGrath and Ulrich Drepper.

可以看到,當前系統的glibc版本是2.12。

那么怎么解決這個警告呢?這里提供兩種方式。

1、配置$HADOOP_CONF_DIR/log4j.properties/log4j.properties文件來忽略掉這個警告,即將前面配置的log4j.logger.org.apache.hadoop.util.NativeCodeLoader=DEBUG該成:

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

2、升級系統的glib版本。

下載glibc-2.14.tar.bz2,地址為:http://ftp.ntu.edu.tw/gnu/glibc/

下載glibc-linuxthreads-2.5.tar.bz2,地址為:http://ftp.ntu.edu.tw/gnu/glibc/

安裝步驟如下:

1) 把下載的bz2包放到一個文件夾下

[wangqi@node001 download]$ ls

glibc-2.14.tar.bz2 glibc-linuxthreads-2.5.tar.bz2

2) 解壓glibc-2.14.tar.bz2到當前目錄

[wangqi@node001 download]$ tar -xjvf glibc-2.14.tar.bz2

[wangqi@node001 download]$ ls

glibc-2.14.tar.bz2 glibc-2.14 glibc-linuxthreads-2.5.tar.bz2

3) 解壓glibc-linuxthreads-2.5.tar.bz2到glibc-2.14

[wangqi@node001 download]$ cd glibc-2.14

[wangqi@node001 glibc-2.14]$ tar -xjvf ../glibc-linuxthreads-2.5.tar.bz2

此時,glibc-2.14目錄下會多出兩個文件夾,即linuxthreads和linuxthreads_db

4) 回到上一級目錄,執行如下命令:

//回到上一級目錄

[wangqi@node001 glibc-2.14]$ cd ..

//加上優化開關,否則會出現錯誤'#error "glibc cannot be compiled without optimization"'

[wangqi@node001 download]$ export CFLAGS="-g -O2"

5) 執行如下命令:

[wangqi@node001 download]$ glibc-2.14/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin --disable-sanity-checks

6) 執行make

//編譯,執行很久(5-10分鍾),可能出錯,出錯再重新執行

[wangqi@node001 download]$ make

7) 執行make install

//安裝,必須root用戶執行,執行很久

[wangqi@node001 download]$ sudo make install

8) 使用命令ls -l /lib/libc.so.6查看是否升級成功

[wangqi@node001 download]$ ll /lib64/libc.so.6

lrwxrwxrwx 1 root root 11 Nov 12 09:24 /lib/libc.so.6 -> libc-2.14.so

9) 重啟hadoop

[wangqi@node002 ~]$ stop-dfs.sh

[wangqi@node002 ~]$ stop-yarn.sh

10) 執行一條hdfs命令,發現本地庫被成功加載

[wangqi@node001 ~]$ export HADOOP_ROOT_LOGGER=DEBUG,console

[wangqi@node001 ~]$ hdfs dfs -ls /

16/01/05 20:02:40 DEBUG util.Shell: setsid exited with exit code 0

16/01/05 20:02:41 DEBUG util.NativeCodeLoader: Trying to load the custom-built native-h­a­doo­p library...

16/01/05 20:02:41 DEBUG util.NativeCodeLoader: Loaded the native-hadoop library

16/01/05 20:02:42 DEBUG ipc.ProtobufRpcEngine: Call: getListing took 2ms

Found 2 items

drwxrwx--- - wangqi supergroup 0 2016-01-05 19:40 /tmp

drwxr-xr-x - wangqi supergroup 0 2016-01-05 19:41 /user

附:libc/glibc/glib

glibc和libc都是Linux下的C函數庫。

libc是Linux下的ANSIC函數庫;glibc是Linux下的GUNC函數庫。

glib是用C寫的一些utilities,即C的工具庫,和libc/glibc沒有關系。

glibc是linux下面c標准庫的實現,即GNU C Library。glibc本身是GNU旗下的C標准庫,后來逐漸成為了Linux的標准c庫,而Linux下原來的標准c庫Linux libc逐漸不再被維護。

glibc在/lib目錄下的.so文件為libc.so.6。

查看當前系統的glibc版本的兩種方法:

[root@node001 ~]# ll /lib64/libc.so.6 

lrwxrwxrwx. 1 root root 12 Oct 11 00:27 /lib64/libc.so.6 -> libc-2.12.so
[root@node001 ~]# ldd --version

ldd (GNU libc) 2.12

Copyright (C) 2010 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Written by Roland McGrath and Ulrich Drepper.

這兩種方法都可以看到當前系統的glibc的版本是2.12。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM