【问题标题】:Error running spark in a Scala REPL - access denied org.apache.derby.security.SystemPermission( "engine", "usederbyinternals" )在 Scala REPL 中运行 spark 时出错 - 拒绝访问 org.apache.derby.security.SystemPermission("engine", "usederbyinternals")
【发布时间】:2018-05-08 11:02:48
【问题描述】:

我一直在使用 IntelliJ 来加快使用 sbt 在 Scala 中开发 Spark 应用程序的速度。我了解基础知识,尽管 IntelliJ 隐藏了很多脚手架,所以我想尝试从命令行启动并运行一些东西(即使用 REPL)。我正在使用 macOS。

这是我所做的:

mkdir -p ~/tmp/scalasparkrepl
cd !$
echo 'scalaVersion := "2.11.12"' > build.sbt
echo 'libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.0"' >> build.sbt
echo 'libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.3.0"' >> build.sbt
echo 'libraryDependencies += "org.apache.spark" %% "spark-hive" % "2.3.0"' >> build.sbt
sbt console

这会打开一个我在其中运行的 scala REPL(包括下载所有依赖项):

import org.apache.spark.SparkConf
import org.apache.spark.sql.{SparkSession, DataFrame}
val conf = new SparkConf().setMaster("local[*]")
val spark = SparkSession.builder().appName("spark repl").config(conf).config("spark.sql.warehouse.dir", "~/tmp/scalasparkreplhive").enableHiveSupport().getOrCreate()
spark.range(0, 1000).toDF()

失败并出现错误access denied org.apache.derby.security.SystemPermission( "engine", "usederbyinternals" ):

scala> spark.range(0, 1000).toDF()
18/05/08 11:51:11 INFO SharedState: Setting hive.metastore.warehouse.dir ('null') to the value of spark.sql.warehouse.dir ('~/tmp/scalasparkreplhive').
18/05/08 11:51:11 INFO SharedState: Warehouse path is '/tmp/scalasparkreplhive'.
18/05/08 11:51:12 INFO StateStoreCoordinatorRef: Registered StateStoreCoordinator endpoint
18/05/08 11:51:12 INFO HiveUtils: Initializing HiveMetastoreConnection version 1.2.1 using Spark classes.
18/05/08 11:51:12 INFO HiveMetaStore: 0: Opening raw store with implemenation class:org.apache.hadoop.hive.metastore.ObjectStore
18/05/08 11:51:12 INFO ObjectStore: ObjectStore, initialize called
18/05/08 11:51:13 INFO Persistence: Property hive.metastore.integral.jdo.pushdown unknown - will be ignored
18/05/08 11:51:13 INFO Persistence: Property datanucleus.cache.level2 unknown - will be ignored
java.security.AccessControlException: access denied org.apache.derby.security.SystemPermission( "engine", "usederbyinternals" )

我用谷歌搜索了一下,有一些关于这个错误的信息,但没有任何信息可以用来解决它。我觉得奇怪的是命令行上的 scala/sbt 项目会出现这个问题,而 IntelliJ 中的 sbt 项目工作正常(我几乎从 IntelliJ 项目中复制/粘贴了代码)。我猜 IntelliJ 正在代表我做某事,但我不知道是什么,这就是我进行此练习的原因。

谁能建议如何解决这个问题?

【问题讨论】:

    标签: scala apache-spark sbt


    【解决方案1】:

    不打算对此给予充分肯定,但它看起来类似于 SBT test does not work for spark test

    解决方案是在运行 Scala 代码之前发出此行:

    System.setSecurityManager(null)
    

    完整的:

    System.setSecurityManager(null)
    import org.apache.spark.SparkConf
    import org.apache.spark.sql.{SparkSession, DataFrame}
    val conf = new SparkConf().setMaster("local[*]")
    val spark = SparkSession.builder().appName("spark repl").config(conf).config("spark.sql.warehouse.dir", "~/tmp/scalasparkreplhive").enableHiveSupport().getOrCreate()
    spark.range(0, 1000).toDF()
    

    【讨论】:

      【解决方案2】:

      您可以适当地设置权限,将其添加到您的 pre-init 脚本中:

      export SBT_OPTS="-Djava.security.policy=runtime.policy"
      

      创建一个runtime.policy文件:

      grant codeBase "file:/home/user/.ivy2/cache/org.apache.derby/derby/jars/*" {
          permission org.apache.derby.security.SystemPermission "engine", "usederbyinternals";
      };
      

      这假定您的 runtime.policy 文件位于当前工作目录中,并且您正在从本地缓存的 Ivy 存储库中提取 Derby .如有必要,更改路径以反映 Derby Jar 的实际父文件夹。星号的位置很重要,这不是传统的 shell glob。

      另请参阅:https://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-10
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        • 2013-01-22
        相关资源
        最近更新 更多