用官方的構建好的Hadoop 2.4.0(133MB)安裝後,每次輸入hadoop命令進去都會獲得這樣一個Warning,如圖:html
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicablejava
網上搜羅了一些資料,下面是解決辦法:shell
設置logger級別,看下具體緣由:apache
export HADOOP_ROOT_LOGGER=DEBUG,console
再次隨便運行一個hadoop相關的命令,將看到下面的錯誤:架構
wrong ELFCLASS32?,難道是加載的so文件系統版本不對?app
因而執行命令svn
cd $HADOOP_HOME/lib/native file libhadoop.so.1.0.0
結果是這樣的:oop
果真是80386,是32位的系統版本,而個人hadoop環境是64位OSui
原來直接從apache鏡像中下載的編譯好的Hadoop版本native library都是32版本的,若是要支持64位版本,必須本身從新編譯,這就有點坑爹了,要知道幾乎全部的生產環境都是64位的OSspa
Hadoop官方對於native library的一段話驗證了這一點(詳見:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/NativeLibraries.html#Download):
「The pre-built 32-bit i386-Linux native hadoop library is available as part of the hadoop distribution and is located in the lib/native directory」
因而從新checkout source code:
svn checkout http://svn.apache.org/repos/asf/hadoop/common/tags/release-2.4.0/
加上編譯native的選項,編譯時會根據當前的操做系統架構來生產相應的native庫(詳見:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/NativeLibraries.html#Build):
mvn package -Pdist,native -DskipTests -Dtar
待編譯完成後,到release-2.4.0/hadoop-dist/target/hadoop-2.4.0/lib/native目錄下找到這個libhadoop.so.1.0.0文件,再次查看其file type:
file libhadoop.so.1.0.0
結果是這樣的:
用這個文件替換掉$HADOOP_HOME/lib/native/libhadoop.so.1.0.0,以後再次隨便運行一個Hadoop相關命令:
unset HADOOP_ROOT_LOGGER hadoop fs -ls /
再看輸出:
WARN消失,問題解決。
參考網址:
http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/NativeLibraries.html