hadoop啓動hdfs異常

記錄一下安裝hadoop遇到的問題,以便後面再次遇到有個解決方式的記錄,也方便其餘人解決相同的問題。在安裝好hadoop後,start-dfs.sh的時候報了util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable。
從字面上來看就是本地的hadoop的庫並不適用於本機的平臺。網上搜索後發現多是如下三種問題致使的:java

問題一:native-hadoop的庫是32位的,而系統是64位的致使不可用。

進入到hadoop目錄下的lib/native目錄下,linux系統使用linux

file libhadoop.so.1.0.0
獲得的結果是
libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=2c6a0dae993e827ec637437f921b30279487049c, not stripped

能夠看到本地hadoop的庫是64位的,個人電腦也是64位的。因此應該不是這個版本的問題apache

問題二:/etc/profile中沒有添加依賴庫的地址。

這個確實我沒有添加過
(1).須要在/etc/profile中添加app

export HADOOP_HOME=/Users/scott/hadoop-3.2.0
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"

而後在使用source /etc/profile從新執行該文件使配置生效。
(2).須要在hadoop-env.sh添加一樣的配置oop

注:我這一步弄完其實hdfs就能夠啓動起來了,可是依然會報標題那個warn。可是不影響使用了。ui

問題三:libhadoop.so.1.0.0缺乏了依賴庫或者glibc

linux:

使用ldd命令去查看libhadoop.so.1.0.0文件是否是缺乏了動態依賴庫
若是出現spa

./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 =>  (0x00007fff369ff000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f3caa7ea000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f3caa455000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f3caac1b000)

這種相似的就是glibc版本問題,使用ldd --version能夠查看版本。.net

# ldd --version
ldd (GNU libc) 2.13
Copyright (C) 2012 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.14,就須要升級glibc版本。這個比較麻煩,並且有必定風險,我遇到的不是這個問題,因此沒有實踐這個操做。能夠參考升級glibc版本code

mac:

還有一種狀況呢,就是有的朋友多是在mac上安裝的hadoop,我也這樣嘗試了。首先排除了問題一後,問題二基本上就解決了問題。若是嘗試問題三會發現,mac上沒有ldd這個命令,網上說使用otool -L 文件,這樣是行不通的。
libhadoop.so是C寫的。須要安裝binutils,而後使用binutils中的readelf命令。
readelf -d 文件|grep NEED

這裏-d就是查看動態依賴庫,grep NEED就是須要的庫。
不過這裏其實只是列舉一下readelf的用法orm

若是要去除這個warn能夠在hadoop的文件夾下的/etc/hadoop/log4j.properties中添加 log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR 把錯誤級別調成ERROR就不會報這個warn了。

相關文章
相關標籤/搜索