Spark3.0.2中导入SparkHadoopUtil后提示无法访问,低版本正常
Spark 3.0.2 调用SparkHadoopUtil报权限错误的原因与解决方案
报错核心根因
这一报错和import语句没有直接关系,本质是Spark 3.0版本对SparkHadoopUtil的访问权限做了收紧:
- Spark 2.x版本中,
SparkHadoopUtil是全局public级别的工具类,外部代码可以直接import并调用方法。 - 从Spark 3.0开始,
SparkHadoopUtil的访问修饰符被调整为private[spark],属于Spark框架内部专用组件,仅允许org.apache.spark包路径下的框架核心代码访问,外部开发者即使手动import全路径,只要不在指定的包作用域内,就会触发编译期的访问权限校验失败,也就是控制台抛出的“对象SparkHadoopUtil在deploy包下无法被当前包访问”的错误。 - Scala语法规则中,import操作本身不会触发访问权限校验,只要类路径可被解析,import语句就会正常执行、不抛出错误,只有后续真正调用类成员时,才会校验访问作用域是否匹配。
3.0.2版本下的替代实现方案
不需要再依赖内部专用的SparkHadoopUtil类,使用Spark对外公开的稳定API即可拿到等价的Hadoop配置实例:
- 如果当前交互式环境已经自动初始化了Spark会话(Spark-shell启动后默认提供名为
spark的SparkSession实例),直接通过SparkContext获取配置即可:val hadoopConf: Configuration = spark.sparkContext.hadoopConfiguration - 如果未初始化Spark会话,也可以直接基于Hadoop原生API创建配置实例,自行加载指定路径的配置文件即可,无需依赖Spark内部工具类。
内容的提问来源于stack exchange,提问作者supernatural
相关产品推荐
相关产品推荐

