我正在尝试运行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
答案 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应用程序时遇到问题:
db.lck
中存在的WebSphere\AppServer\profiles\AppSrv04\databases\EJBTimers\server1\EJBTimerDB
文件(我的数据库是导致问题的EJBTimerDB)答案 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命令杀死它。
重启系统的最佳解决方案。