Scala REPL中运行Spark报错:权限拒绝org.apache.derby.security.SystemPermission
解决Scala REPL运行Spark时的Derby权限报错问题
嘿,我懂你想跳出IDE封装、直接用命令行REPL摸透Spark底层运行逻辑的想法——这种操作确实能帮你更清晰理解依赖加载和框架运行机制。先整理下你的操作流程,再针对性解决那个权限报错:
你的操作流程(整理版)
你在macOS上做的准备步骤很清晰:
- 创建项目目录:
mkdir -p ~/tmp/scalasparkrepl - 快速进入目录:
cd !$ - 编写
build.sbt配置文件:scalaVersion := "2.11.12" libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.0"
之后启动Scala REPL(应该是运行sbt console?)时遇到了这个报错:
Error running spark in a Scala REPL - access denied org.apache.derby.security.SystemPermission( "engine", "usederbyinternals" )
报错原因拆解
这个问题的核心是:Spark的部分组件(比如元数据管理模块)依赖Apache Derby数据库,但JVM默认的安全策略限制了REPL环境下访问Derby的内部API,直接触发了权限拦截。
两种靠谱解决方案
方式一:启动时临时指定安全策略文件
- 在你的项目目录下创建一个名为
spark.policy的文件,内容如下:grant { permission org.apache.derby.security.SystemPermission "engine", "usederbyinternals"; }; - 用带参数的命令启动sbt console:
sbt -Djava.security.policy=spark.policy console
方式二:在build.sbt中配置JVM参数(一劳永逸)
如果你不想每次启动都敲长命令,可以把参数固化到配置里:
- 同样先创建上面的
spark.policy文件 - 修改
build.sbt,添加一行JVM参数配置:javaOptions in console += "-Djava.security.policy=spark.policy" - 之后直接运行
sbt console就能正常启动REPL并使用Spark了
额外验证小技巧
你的Scala和Spark版本搭配是完全正确的(Spark 2.3.x对应Scala 2.11系列),不用调整版本。启动REPL后,可以试试这段代码验证是否正常:
import org.apache.spark.SparkContext import org.apache.spark.SparkConf val conf = new SparkConf().setMaster("local[*]").setAppName("REPLSparkTest") val sc = new SparkContext(conf)
如果能成功创建SparkContext,就说明问题彻底解决啦~
内容的提问来源于stack exchange,提问作者jamiet
相关产品推荐
相关产品推荐

