在 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
。不能使用本地庫的影響:部分壓縮算法不能使用。查看本地庫的支持情況,請參考下面的鏈接:
既然是 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
級別之下的,比如 DEBUG
、INFO
、WARN
等,都會被忽略。
來看看它確實起作用了:

當然了,這個方法治標不治本,最終還是沒有成功加載到 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://www.cnblogs.com/shoufeng)
感謝閱讀,公眾號 「瘦風的南牆」 ,手機端閱讀更佳,還有其他福利和心得輸出,歡迎掃碼關注🤝
本文版權歸博主所有,歡迎轉載,但 [必須在頁面明顯位置標明原文鏈接],否則博主保留追究相關人士法律責任的權利。