作者:是非涩味_943 | 来源:互联网 | 2023-09-09 11:06
在macOSBigSur系统安装的Hadoop3.2.1集群,通过客户端操作HDFS中的文件,命令行中总是会有这样的警告:WARNutil.NativeCode
在 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="" /
意思是,对于 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_HOME}/lib/native 中(删除原来的所有文件)。
不用重启 Hadoop 集群,即可验证警告消失(Hadoop-3.2.1 为例):
查看 Hadoop 支持的本地库信息:
其中报错是因为本地没有 snappy 压缩相关的库,暂时忽略。
5 - 根据源码,编译本地库 - 有效
编译过程,参考 ,编译完成后,拷贝。。。到。。。
然后重启 HDFS,快看!告警终于消失了
作者:
出处:
感谢阅读,公众号 ,手机端阅读更佳,还有其他福利和心得输出,欢迎扫码关注
本文版权归博主所有,欢迎转载,但 [必须在页面明显位置标明原文链接],否则博主保留追究相关人士法律责任的权利。