Win11 IntelliJ运行Spark报错HiveSessionStateBuilder实例化失败
问题解决方案
根因分析
该错误的核心是Windows系统下Spark默认加载Hive组件,Hive需要读写临时目录/tmp/hive,但Windows的文件权限逻辑和Hadoop的权限校验逻辑不兼容,即便目录设置了所有人可写,Hadoop也无法正常识别权限配置,进而抛出异常。
可行解决方案(按实施优先级排序)
方案1:禁用Hive Catalog(最快捷,适合未使用Hive功能的场景)
你的测试用例仅涉及Parquet文件读写,无需Hive支持,直接修改SparkSession构造配置,使用内存型Catalog即可规避该问题,修改后的代码如下:
test("RawData read") { val typp = "" val spark = SparkSession.builder() .master("local[1]") .appName("SparkByExamples.com") // 新增以下配置,禁用Hive Catalog,使用内存实现 .config("spark.sql.catalogImplementation", "in-memory") .getOrCreate() // 其余代码保持不变 val actual = new DataReader(spark, typp).readRawData("./src/test/resources/input/parquet/part-00000-512bb01c-ef7a-4760-bfe9-905f504e4840.c000.snappy.parquet") actual.coalesce(1).limit(100).write.mode(SaveMode.Overwrite).save("./src/test/resources/output/") import spark.implicits._ // 注意这里原来的sqlContext可以替换为spark,避免旧API问题 val expected: Dataset[RawData] = spark .read .parquet("./src/test/resources/output/") .map(row => RawData( row.getString(0), row.getDouble(1), row.getInt(2), row.getString(3), row.getDouble(4), row.getLong(5), row.getString(6) )) assert(actual.limit(100).collectAsList() === expected.collectAsList()) }
额外优化:将原来的import sqlContext.implicits._替换为import spark.implicits._,避免使用废弃的sqlContext API引发其他兼容问题
方案2:配置Windows Hadoop运行环境(适合需要使用Hive功能的场景)
- 下载和你Spark依赖的Hadoop版本完全匹配的
winutils.exe和hadoop.dll文件,存放到本地目录如C:\hadoop\bin下 - 配置系统环境变量:
- 新建
HADOOP_HOME,值为C:\hadoop - 在Path变量中添加
%HADOOP_HOME%\bin - 重启IntelliJ IDEA,确保环境变量生效
- 新建
- 手动创建目录
C:\tmp\hive,右键打开目录属性->安全,给当前Windows用户、Everyone用户授予完全控制权限 - 打开CMD执行权限配置命令:
C:\hadoop\bin\winutils.exe chmod 777 C:\tmp\hive
方案3:项目级配置规避(无需修改系统环境变量)
在测试代码初始化SparkSession前添加以下系统属性配置,指定Hadoop路径和Hive临时目录到当前项目路径下:
System.setProperty("hadoop.home.dir", "C:\\path\\to\\your\\hadoop") System.setProperty("hive.exec.scratchdir", "./target/tmp/hive")
如果不需要Hive功能,也可以在sbt配置中直接排除spark-hive依赖,在build.sbt中添加:
libraryDependencies ~= { _.map(_.exclude("org.apache.spark", "spark-hive_你的Scala版本号")) }
注意事项
- 所有系统环境变量修改后必须重启IntelliJ,否则IDEA运行测试时仍会读取旧的环境变量配置
- winutils版本必须和Spark依赖的Hadoop版本严格一致,否则会出现其他兼容性错误
内容的提问来源于stack exchange,提问作者carmArt
相关产品推荐
相关产品推荐

