Spark主函数出现ArrayIndexOutOfBoundsException问题求助
解决Mac上Spark启动时NativeCodeLoader警告的办法
嘿,我之前在Mac上搭建Spark+Hadoop开发环境时也碰到过一模一样的警告,别担心,这本质上是警告而非错误,不会影响Spark的核心计算功能,但要是看着闹心或者确实需要依赖Hadoop原生库的高级特性(比如HDFS的高效IO),可以试试下面的几种解决思路:
一、先搞懂警告的原因
Hadoop的原生库(native library)是针对不同操作系统架构编译的二进制文件,默认的Hadoop安装包可能没有适配MacOS(尤其是M系列芯片的Mac)的原生库,所以系统会自动 fallback 到纯Java实现的版本,同时抛出这个警告。
二、具体解决方案
方案1:修改日志配置,直接隐藏警告
如果只是不想看到这个提示,最快的办法是调整Spark的log4j日志级别:
- 找到Spark安装目录下的默认配置文件:
org/apache/spark/log4j-defaults.properties - 把这个文件复制到你的IntelliJ项目的
src/main/resources目录下(如果没有resources目录就新建一个) - 打开复制后的文件,找到这一行:
把它改成:log4j.logger.org.apache.hadoop.util.NativeCodeLoader=WARNlog4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR - 重启你的Spark程序,这个警告就不会再出现了。
方案2:安装适配Mac的Hadoop原生库
如果确实需要原生库支持(比如优化HDFS的读写性能),可以按以下步骤操作:
- 确认版本匹配:确保你下载的原生库和当前Hadoop、Spark版本兼容(你的Spark是2.3.0,对应的Hadoop建议用2.7.x系列)
- 获取适配的原生库:你可以选择自己编译Hadoop源码生成Mac适配的原生库,或者找社区预编译好的对应版本的
hadoop-native包 - 替换原生库文件:把下载到的原生库文件(一般是
.dylib或.so格式)替换到Hadoop安装目录下的$HADOOP_HOME/lib/native文件夹中 - 配置环境变量:打开终端,编辑你的shell配置文件(比如
~/.zshrc或~/.bash_profile),添加以下内容:
保存后执行export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native" export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATHsource ~/.zshrc(对应你的配置文件)使环境变量生效 - 验证效果:在终端运行
hadoop checknative命令,查看原生库的加载状态;或者重启IntelliJ运行Spark程序,看警告是否消失。
三、额外提醒
要是你只是刚开始学习Spark和Scala,其实这个警告完全可以忽略,不影响你写代码和运行基本的Spark任务。等后面用到需要原生库的场景时,再按方案2处理也不迟~
内容的提问来源于stack exchange,提问作者JeanP
相关产品推荐
相关产品推荐

