Windows本地spark-submit提交任务SparkContext初始化失败
问题原因
- Spark的底层文件操作逻辑依赖Hadoop的相关实现,Windows环境下运行Spark(包括本地模式)不需要部署完整的Hadoop集群,但必须依赖
winutils.exe这个Windows平台适配工具,用来处理文件权限校验、路径格式转换等底层操作,你收到的报错就是因为缺少这个工具的相关配置。 - spark-shell可以正常启动的原因是,spark-shell启动脚本默认会自动将
%SPARK_HOME%临时设置为hadoop.home.dir参数的值,优先读取Spark安装目录下bin文件夹里的winutils.exe,而你自行开发的应用通过spark-submit提交时,默认不会自动注入这个配置,所以会触发找不到配置的报错。
解决方法
以下方案任选其一即可:
方案1:提交命令临时添加配置(无需修改系统环境,适合临时测试)
在原spark-submit命令中添加JVM参数指定hadoop.home.dir为你的Spark安装根目录即可:
%SPARK_HOME%\bin\spark-submit --master local --conf spark.driver.extraJavaOptions="-Dhadoop.home.dir=%SPARK_HOME%" --class example.bd.MyApp target\scala-2.12\sparkapp_2.12-1.5.5.jar
注意:需要确保%SPARK_HOME%\bin目录下存在对应版本的winutils.exe,大部分官方提供的Windows版Spark预编译包已经自带该文件。
方案2:配置系统环境变量(永久生效,推荐)
- 新增系统环境变量
HADOOP_HOME,变量值填写你的Spark安装根目录的绝对路径(和SPARK_HOME的值完全一致即可) - 编辑系统变量
Path,新增一条%HADOOP_HOME%\bin
配置完成后重启命令行窗口,再次执行spark-submit命令即可正常运行。
方案3:代码中硬编码配置(仅适合本地测试场景,不推荐生产使用)
在创建SparkConf实例之前,手动设置系统属性指定hadoop.home.dir路径:
package example.bd import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ object MyApp { def main(args : Array[String]) { // 新增这一行,路径替换为你本地的Spark安装根目录绝对路径 System.setProperty("hadoop.home.dir", "C:\\spark-3.x.x-bin-hadoop3") val conf = new SparkConf().setAppName("My first Spark application") val sc = new SparkContext(conf) println("hi everyone") } }
内容的提问来源于stack exchange,提问作者Aron Latis
相关产品推荐
相关产品推荐

