java - stable - Hadoop“無法為您的平台加載native-hadoop庫”警告




native hadoop (14)

我目前正在運行CentOs的服務器上配置hadoop。 當我運行start-dfs.shstop-dfs.sh ,出現以下錯誤:

WARN util.NativeCodeLoader:無法為您的平台加載native-hadoop庫......在適用的情況下使用builtin-java類

我正在運行Hadoop 2.2.0。

在網上做一個搜索提出了這個鏈接: http://balanceandbreath.blogspot.ca/2013/01/utilnativecodeloader-unable-to-load.html : http://balanceandbreath.blogspot.ca/2013/01/utilnativecodeloader-unable-to-load.html

但是,hadoop 2.x上的/native/目錄的內容看起來不同,所以我不知道該怎麼做。

我也在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 /”

有任何想法嗎?


@zhutoulala - FWIW您的鏈接為我工作與Hadoop 2.4.0有一個例外,我不得不告訴maven不建立javadocs。 我也在2.4.0的第一個鏈接中使用了該補丁,並且它工作正常。 這是我必鬚髮布的maven命令

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

建立這個和移動庫後,不要忘記更新hadoop-env.sh :)

認為這可能會幫助那些遇到與我一樣的障礙的人


以前發布的驗證補救措施:

1)檢查Hadoop發行libhadoop.so.1.0.0附帶的libhadoop.so.1.0.0是為我的機器體系結構(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)在hadoop-env.sh添加了-Djava.library.path=<path>HADOOP_OPT

export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -Djava.library.path=/opt/hadoop-2.6.0/lib/native"

這確實使惱人的警告消失。


如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 * ../

乾杯


將編譯的本機庫文件移動到$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文件夾中。

它應該工作。


對於那些通過Homebrew安裝Hadoop的OSX,請按照以下步驟在適當的位置替換路徑和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/

然後更新hadoop-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"

就我而言,在我的64位Linux薄荷OS上構建hadoop之後,我用hadoop/lib替換了本地庫。 問題仍然存在。 然後我想出hadoop指向hadoop/lib而不是hadoop/lib/native 。 所以我只是將所有內容從本地庫移到其父項。 警告消失了。


我有與JDK6相同的問題,我將JDK更改為JDK8,解決了問題。 嘗試使用JDK8!


我沒有使用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]

用您的用戶名替換用戶


答案取決於...我在64位CentOS 6.6上從tarball安裝了Hadoop 2.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

我希望這可以幫助其他人看到開源軟件的一大優點是,如果你採取一些簡單的邏輯步驟,你就可以把這些東西弄清楚。


這也是可行的:

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

這條線就在這裡:

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

來自KunBetter的答案是錢的來源


除了@zhutoulala接受的答案外,這裡還有一個更新,使其能夠在ARMHF平台(Raspberry Pi 3 model B)上使用最新的穩定版本(2.8)。 首先,我可以確認您必須將本機庫重新編譯為64位ARM,但在此基於設置某些環境變量的其他答案將不起作用。 正如Hadoop文檔中所述,預構建的本地庫是32位的。

在拳頭鏈接中提供的高級步驟( http://www.ercoppa.org/posts/how-to-compile-apache-hadoop-on-ubuntu-linux.html )是正確的。 在此網址http://www.instructables.com/id/Native-Hadoop-260-Build-on-Pi/您可以獲得更多關於Raspberry Pi的詳細信息,但不適用於Hadoop 2.8版。

以下是我的註釋Hadoop 2.8:

  • 最新的Raspbian上仍然沒有protobuf軟件包,所以你必須自己編譯它,版本必須完全是protobuf 2.5( https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz
  • 必須更改CMake文件修補方法。 更多,文件補丁是不一樣的。 不幸的是,對於2.8的JIRA沒有公認的補丁。 在此URL( https://issues.apache.org/jira/browse/HADOOP-9320 )上,您必須複製並粘貼您的namenode上的Andreas Muttscheller建議的補丁:

    :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 *

並將Hadoop安裝的lib / native目錄的內容替換為此歸檔的內容。 運行Hadoop時的警告消息應該消失。


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

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_COMMON_LIB_NATIVE_DIR"