Hadoop - 徹底解決 WARN util.NativeCodeLoader: Unable to load native-hadoop library...


在 macOS Big Sur 系統安裝的 Hadoop 3.2.1 集群,通過客戶端操作 HDFS 中的文件,命令行中總是會有這樣的警告:

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

這個警告是說,Hadoop 沒有成功加載你電腦的本地庫,所以使用了內置的 Java 類庫。

本地庫的作用:提升一些操作的性能(Java 不夠快),並且彌補 Java 類庫的不足,Hadoop 為某些組件提供了自己的本地實現,保存在一個獨立的動態鏈接的庫里,在 類 Uinux 平台上名為 libhadoop.so

不能使用本地庫的影響:部分壓縮算法不能使用。查看本地庫的支持情況,請參考下面的鏈接:

HDFS 02 - macOS 系統安裝 HDFS - 1 准備安裝包

既然是 WARN,說明它不會影響正常的讀寫,但是強迫症患者表示,總是看到這玩意,讓人抓狂。

今天就來寫寫怎么徹底解決掉它!

1 - 在日志配置文件中忽略警告 - 有效

找到 Hadoop 的安裝配置路徑,然后編輯日志配置:

cd ${HADOOP_HOME}
vim etc/hadoop/log4j.properties
# 在文件最后面追加:
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR

<img src="https://img2020.cnblogs.com/blog/1438655/202106/1438655-20210627115337494-50680247.png" width=50%" />

意思是,對於 org.apache.hadoop.util.NativeCodeLoader 類的日志,只打印 ERROR 及以上級別,那么 ERROR 級別之下的,比如 DEBUGINFOWARN 等,都會被忽略。

來看看它確實起作用了:

當然了,這個方法治標不治本,最終還是沒有成功加載到 native-hadoop library

2 - 指定本地庫的路徑 - 無效

先把上面對日志配置文件的修改,還原回去。

我們來看看這個告警到底是什么幺蛾子。

1)增加日志調試信息:

# 只在當前終端(命令行)有效,新打開的終端無效:
export HADOOP_ROOT_LOGGER=DEBUG,console

再執行 HDFS 命令,我們會看到這個:

2021-06-27 14:41:33,165 DEBUG util.NativeCodeLoader: Trying to load the custom-built native-hadoop library...
2021-06-27 14:41:33,166 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: no hadoop in java.library.path
2021-06-27 14:41:33,166 DEBUG util.NativeCodeLoader: java.library.path=/Users/healchow/bigdata/hadoop-3.2.1/lib
2021-06-27 14:41:33,166 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
2021-06-27 14:41:33,166 DEBUG util.PerformanceAdvisory: Falling back to shell based

Hadoop 到這里查找 native-hadoop:/Users/healchow/bigdata/hadoop-3.2.1/lib,准確的應該是 /Users/healchow/bigdata/hadoop-3.2.1/lib/native

2)修改 hadoop-env.sh 指定本地庫路徑:

# 向 etc/hadoop/hadoop-env.sh 文件大約95行,添加下面2行配置:
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_HOME}/lib/native
export HADOOP_OPTS="-Djava.library.path=${HADOOP_HOME}/lib/native"

保存后,重啟 HDFS,然后再次執行 HDFS 命令,發現依舊報錯:

2021-06-27 14:46:15,746 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: no hadoop in java.library.path
2021-06-27 14:46:15,746 DEBUG util.NativeCodeLoader: java.library.path=/Users/healchow/bigdata/hadoop-3.2.1/lib/native
2021-06-27 14:46:15,746 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

經過各種搜索驗證,猜測是由於下載的安裝包中,本地庫是通過 32 位機器編譯而來,在64位機器上不能運行。

3 - 不使用 Hadoop 本地庫 - 無效

保留上一步的修改。在 Hadoop 的配置文件 core-site.xml 中禁用本地庫 —— 默認開啟並使用:

    <property>
        <name>hadoop.native.lib</name>
        <value>false</value>
        <description>Should native hadoop libraries, if present, be used.</description>
    </property>

重啟 NameNode 再試,在 macOS Big Sur 中,Hadoop 版本為 3.2.1,發現警告依舊存在😓 繼續找其他方法。

4 - 替換 Hadoop 本地庫 - 有效

修改 core-site.xml,重新啟用本地庫。

然后,從 hadoop-native-macos 下載對應版本的本地庫,替換到本地 ${HADOOP_HOME}/lib/native 中(刪除原來的所有文件)。

不用重啟 Hadoop 集群,即可驗證警告消失(Hadoop-3.2.1 為例):

查看 Hadoop 支持的本地庫信息:

其中報錯是因為本地沒有 snappy 壓縮相關的庫,暫時忽略。

5 - 根據源碼,編譯本地庫 - 有效

編譯過程,參考 Hadoop - macOS 上編譯 Hadoop 3.2.1

編譯完成后,拷貝 ${源碼}/hadoop-dist/target/hadoop-3.2.1/lib/native 到 Hadoop 集群安裝目錄下的 lib/native 下,覆蓋已有的文件。

然后執行 HDFS 命令,快看,告警終於消失了🎉


版權聲明

作者:瘦風(https://healchow.com)

出處:博客園-瘦風的南牆(https://www.cnblogs.com/shoufeng)

感謝閱讀,公眾號 「瘦風的南牆」 ,手機端閱讀更佳,還有其他福利和心得輸出,歡迎掃碼關注🤝

本文版權歸博主所有,歡迎轉載,但 [必須在頁面明顯位置標明原文鏈接],否則博主保留追究相關人士法律責任的權利。


免責聲明!

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



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