引发者:错误XSDB6:Derby的另一个实例可能已经启动了数据库

时间:2015-12-25 18:56:09

标签: hadoop apache-spark derby

我正在尝试运行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 文件夹。
我的hive Metastore包含mysql as metastore。但不确定为什么错误显示为derby execption

11 个答案:

答案 0 :(得分:26)

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

引起:错误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并重新启动了我的数据框功能,它运行得很好:)

答案 1 :(得分:13)

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

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

答案 2 :(得分:2)

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

sqlContext.sql("CREATE TABLE....

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

答案 3 :(得分:2)

当您尝试将动态帧转换为数据帧时,另一种可以看到相同错误的情况是AWS Glue dev端点的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在变量SparkSession中包含实例化spark,您只需在创建新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 :(得分:1)

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

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

答案 5 :(得分:1)

当我使用pyspark ml Word2Vec时发生了这种情况。我试图加载以前建立的模型。特技是,只需使用sqlContext创建pyspark或scala的空数据框。以下是python语法 -

from pyspark.sql.types import StructType

schema = StructType([])`
empty = sqlContext.createDataFrame(sc.emptyRDD(), schema)

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

答案 6 :(得分:0)

我通过运行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)) 所以你可以在重建它之前运行它,但是我见过有人报告这个并没有帮助他们。

答案 7 :(得分:0)

错误来自于您尝试在同一节点中运行的多个火花外壳,或者由于系统故障导致其关闭而没有正确退出火花外壳,在任何原因您只需查找进程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

答案 8 :(得分:0)

转到metastore_db并删除所有.lck文件。

答案 9 :(得分:0)

在多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 plugin中,我正在清理此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>

答案 10 :(得分:-2)

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

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