java - stable - Hadoop“無法為您的平台加載native-hadoop庫”警告
native hadoop (14)
我目前正在運行CentOs的服務器上配置hadoop。 當我運行start-dfs.sh
或stop-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
所以,到這裡看看它的功能:
啊,有一些調試級別的日誌記錄 - 讓我們來看看是否有更多的幫助。 這通過將以下行添加到$ 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"