MacOS本地安装Spark运行Scala作业时遇StringIndexOutOfBoundsException错误
解决SparkContext初始化时的StringIndexOutOfBoundsException问题
我之前在Mac上踩过类似的版本兼容坑,你的这个异常大概率是Spark 2.3.0和Hadoop 3.0.0版本不匹配导致的,具体原因和解决方案如下:
问题根源
Spark 2.3.0的官方兼容文档里,支持的Hadoop版本是2.6.x到2.8.x区间,而Hadoop 3.0.0属于较新的大版本,其中部分API(尤其是字符串处理相关的底层逻辑)和Spark 2.3.0的实现不兼容,才会在初始化SparkContext时抛出StringIndexOutOfBoundsException。
可行解决方案
方案1:降级Hadoop到兼容版本
Spark 2.3.0对Hadoop 2.8.5的兼容性很好,你可以用brew操作:
- 卸载当前Hadoop:
brew uninstall hadoop - 安装指定版本:
brew install hadoop@2.8.5 - 配置环境变量(在
~/.bash_profile或~/.zshrc中添加):export HADOOP_HOME=/usr/local/opt/hadoop@2.8.5 export PATH=$HADOOP_HOME/bin:$PATH - 生效环境变量:
source ~/.bash_profile(或对应的zsh配置文件)
方案2:升级Spark到支持Hadoop 3.x的版本
Spark从2.4.0开始正式支持Hadoop 3.x系列,升级后可以直接适配你当前的Hadoop 3.0.0:
- 卸载当前Spark:
brew uninstall spark - 安装指定版本:
brew install spark@2.4.0 - 配置环境变量:
export SPARK_HOME=/usr/local/opt/spark@2.4.0 export PATH=$SPARK_HOME/bin:$PATH - 生效环境变量:
source ~/.bash_profile
验证步骤
改完版本后,先在终端运行spark-shell,如果能正常进入Spark交互环境,说明版本适配成功,再重新运行你的Scala代码即可。
内容的提问来源于stack exchange,提问作者Wonay
相关产品推荐
相关产品推荐

