【问题标题】:Caused by: ERROR XSDB6: Another instance of Derby may have already booted the database原因:ERROR XSDB6:另一个 Derby 实例可能已经启动了数据库
【发布时间】:2016-03-31 15:35:39
【问题描述】:

我正在尝试运行 SparkSQL:

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)  

但我得到的错误如下:

        ... 125 more
Caused by: java.sql.SQLException: Another instance of Derby may have already booted the database /root/spark/bin/metastore_db.
        at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
        at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
        ... 122 more
Caused by: ERROR XSDB6: Another instance of Derby may have already booted the database /root/spark/bin/metastore_db.
        at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
        at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.privGetJBMSLockOnDB(Unknown Source)
        at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.getJBMSLockOnDB(Unknown Source)
        at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.boot(Unknown Source)

我看到有一个 metastore_db 文件夹存在..
我的配置单元元存储包括 mysql 作为元存储。但不知道为什么错误显示为 derby execption

【问题讨论】:

  • 您的问题是:“我以为我在 metastore_db 中使用了 mysql,但 Spark 认为我正在使用 Derby。为什么会这样?”或者您的问题是:“我打算将 Derby 用于我的 metastore_db,但 Spark 无法打开数据库,因为其他一些 Derby 应用程序已经打开了数据库。为什么会这样?”
  • 不..我不想使用德比..它会自动进行..不知道为什么这是错误..
  • 这将有助于dataunbox.com/…

标签: hadoop apache-spark derby


【解决方案1】:

在我的 multi maven spark 设置中运行测试用例时出现此错误。 我在我的测试类中分别创建 sparkSession,因为单元测试用例每次通过配置文件传递时都需要不同的 spark 参数。 为了解决这个问题,我遵循了这种方法。 在 Spark 2.2.0 中创建 sparkSession 时

//This is present in my Parent Trait.
def createSparkSession(master: String, appName: String, configList: List[(String, String)]): SparkSession ={
    val sparkConf = new SparkConf().setAll(configList)
    val spark = SparkSession
      .builder()
      .master(master)
      .config(sparkConf)
      .enableHiveSupport()
      .appName(appName)
      .getOrCreate()
    spark
  }

在我的测试课中

//metastore_db_test will test class specific folder in my modules.
val metaStoreConfig = List(("javax.jdo.option.ConnectionURL", "jdbc:derby:;databaseName=hiveMetaStore/metastore_db_test;create=true"))
    val configList = configContent.convertToListFromConfig(sparkConfigValue) ++ metaStoreConfig
    val spark = createSparkSession("local[*]", "testing", configList)

然后在 maven clean 插件中发布我正在清理这个 hiveMetaStore 目录。

//Parent POM
<plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                    <configuration>
                        <filesets>
                            <fileset>
                                <directory>metastore_db</directory>
                            </fileset>
                            <fileset>
                                <directory>spark-warehouse</directory>
                            </fileset>
                        </filesets>
                    </configuration>
                </plugin>

子模块 POM

<plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <configuration>
                    <filesets>
                        <fileset>
                            <directory>hiveMetaStore</directory>
                            <includes>
                                <include>**</include>
                            </includes>
                        </fileset>
                        <fileset>
                            <directory>spark-warehouse</directory>
                        </fileset>
                    </filesets>
                </configuration>
            </plugin>

【讨论】:

  • 什么是配置内容
【解决方案2】:

lck(lock) 文件是一个访问控制文件,它锁定数据库,以便只有单个用户可以访问或更新数据库。 该错误表明存在另一个使用同一数据库的实例。因此,您需要删除 .lck 文件。 在您的主目录中,转到 metastore_db 并删除所有 .lck 文件。

【讨论】:

  • 不了解hadoop,我想知道这个问题是否提供了足够有用的信息。考虑编辑它并添加 .lck 文件的信息。
  • 这对我有用!正在尝试加载弹性搜索
【解决方案3】:

当您尝试将动态帧转换为数据帧时,您会看到相同错误的另一种情况是 AWS Glue 开发终端节点的 Spark REPL。

实际上有几个不同的例外,例如:

  • pyspark.sql.utils.IllegalArgumentException: u"Error while instantiating 'org.apache.spark.sql.hive.HiveSessionState':"
  • ERROR XSDB6: Another instance of Derby may have already booted the database /home/glue/metastore_db.
  • java.sql.SQLException: Failed to start database 'metastore_db' with class loader org.apache.spark.sql.hive.client.IsolatedClientLoader

用谷歌很难找到解决方案,但最终它被描述为here

加载的 REPL 在变量spark 中包含一个实例化的SparkSession,您只需在创建新的SparkContext 之前停止它:

>>> spark.stop()
>>> from pyspark.context import SparkContext
>>> from awsglue.context import GlueContext
>>>
>>> glue_context = GlueContext(SparkContext.getOrCreate())
>>> glue_frame = glue_context.create_dynamic_frame.from_catalog(database=DB_NAME, table_name=T_NAME)
>>> df = glue_frame.toDF()

【讨论】:

    【解决方案4】:

    我在创建表格时遇到了同样的问题。

    sqlContext.sql("CREATE TABLE....
    

    我可以看到ps -ef | grep spark-shell 的许多条目,所以我将它们全部杀死并重新启动spark-shell。它对我有用。

    【讨论】:

      【解决方案5】:

      这发生在我使用 pyspark ml Word2Vec 时。我试图加载以前构建的模型。诀窍是,只需使用 sqlContext 创建 pyspark 或 scala 的空数据框。以下是python语法 -

      from pyspark.sql.types import StructType
      
      schema = StructType([])`
      empty = sqlContext.createDataFrame(sc.emptyRDD(), schema)
      

      这是一种解决方法。使用此块后我的问题得到解决。 注意 - 它仅在您从 HiveContext 实例化 sqlContext 时发生,而不是 SQLContext。

      【讨论】:

      • 哇,这对我很有用,谢谢,我花了很长时间试图从 pyspark.ml 加载 Pipeline.model,我之前保存在另一个系统上。你知道是什么导致了这个问题吗? (也是小事:我试图编辑你的答案以删除杂散的反引号,但 StackOverflow 不允许我,因为编辑少于 6 个字符)。
      【解决方案6】:

      如果您在 Windows 机器上启动 WAS 应用程序时遇到问题:

      1. 使用任务管理器杀死 java 进程
      2. 删除WebSphere\AppServer\profiles\AppSrv04\databases\EJBTimers\server1\EJBTimerDB 中存在的db.lck 文件(我的数据库是导致问题的EJBTimerDB)
      3. 重新启动应用程序。

      【讨论】:

        【解决方案7】:

        错误的出现是因为您尝试在同一节点中运行多个 spark shell,或者由于系统故障而在没有正确退出 spark shell 的情况下关闭,无论出于何种原因,您只需找出进程 ID 并杀死它们,为了我们

        [hadoop@localhost ~]$ ps -ef | grep spark-shell
        hadoop    11121   9197  0 17:54 pts/0    00:00:00 grep --color=auto spark-shell
        [hadoop@localhost ~]$ kill 9197
        

        【讨论】:

        • 我参加聚会有点晚了,但在你的例子中,你刚刚杀死了你用来寻找进程的进程。甚至在你使用 kill 的时候就已经消失了。
        【解决方案8】:

        很难找到另一个线程访问您的 derby metastore_db 的位置,如果您能够找到该进程,那么您可以使用 kill 命令杀死它。

        重启系统的最佳解决方案。

        【讨论】:

          【解决方案9】:

          我在 Spark Shell 上创建数据框时遇到了同样的错误:

          原因:ERROR XSDB6:另一个 Derby 实例可能已经启动了数据库 /metastore_db。

          原因:

          我发现这种情况正在发生,因为有多个其他 Spark-Shell 实例已经在运行并持有 derby DB,所以当我启动另一个 Spark Shell 并使用 RDD.toDF() 在其上创建数据框时,它是抛出错误:

          解决方案:

          我运行 ps 命令来查找其他 Spark-Shell 实例:

          ps -ef | grep spark-shell

          我使用 kill 命令杀死了他们:

          kill -9 Spark-Shell-processID(例如:kill -9 4848)

          在所有 SPark-Shell 实例消失后,我启动了一个新的 SPark SHell 并重新运行了我的 Data frame 函数,它运行得很好:)

          【讨论】:

          • 杀死 hive 进程并重新启动它有帮助,谢谢!
          • ps -ef | grep spark-shell
          • 这对我有帮助。
          • 这个。即使我杀死了iTerm2spark-shell 仍在运行。这是一个有趣的现象。
          【解决方案10】:

          我在运行sqlContext._get_hive_ctx() 时遇到了这个错误 这是由于最初尝试将流水线 RDD 加载到数据帧中引起的 我得到了错误 Exception: ("You must build Spark with Hive. Export 'SPARK_HIVE=true' and run build/sbt assembly", Py4JJavaError(u'An error occurred while calling None.org.apache.spark.sql.hive.HiveContext.\n', JavaObject id=o29)) 所以你可以在重建它之前运行它,但仅供参考,我看到其他人报告这对他们没有帮助。

          【讨论】:

            【解决方案11】:

            如果您在 spark shell 中运行,则不应实例化 HiveContext,它会自动创建一个名为 sqlContext(名称具有误导性 - 如果您使用 Hive 编译 Spark,它将是一个 HiveContext)。见类似讨论here

            如果你没有在 shell 中运行——这个异常意味着你在同一个 JVM 中创建了多个 HiveContext,这似乎是不可能的——你只能创建一个。

            【讨论】:

            • 但如果 shell 自动执行此操作,用户如何避免它来解决问题?
            • 用户不需要解决它 - 错误的原因是用户试图通过调用 new org.apache.spark.sql.hive.HiveContext(sc) 创建 另一个 上下文 - 如果你只是避免这样做那样,您什么也不会丢失(因为您已经有了可以使用的 HiveContext)并克服了错误。
            • 问题是它似乎在当前的 spark v2.2 中自动发生。只需在同一台机器上启动第二个 spark-shell 就足以导致错误。
            猜你喜欢
            • 2014-05-27
            • 2017-12-06
            • 2019-12-25
            • 2015-09-26
            • 1970-01-01
            • 2013-12-13
            • 2014-07-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多