Причина: ERROR XSDB6: Еще один экземпляр 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..
Мой метафайл улья включает в себя mysql как метастор. Но не знаю, почему ошибка отображается как выполнение derby

Ответ 1

Я получал ту же ошибку при создании кадров данных в Spark Shell:

Вызвано: ERROR XSDB6: Еще один экземпляр Derby, возможно, уже загрузил базу данных /metastore _db.

Причина:

Я обнаружил, что это происходит, поскольку уже существует несколько других экземпляров Spark-Shell, которые уже запущены и держу дерби DB, поэтому, когда я запускал еще одну Spark Shell и создавал Data Frame на ней с помощью 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, и она просто прекратилась:)

Ответ 2

Если вы работаете в искровой оболочке, вам не следует создавать экземпляр HiveContext, который автоматически создается под именем sqlContext (имя вводит в заблуждение - если вы скомпилировали Spark с Hive, это будет быть HiveContext). См. Аналогичное обсуждение здесь.

Если вы не работаете в оболочке - это исключение означает, что вы создали более одного HiveContext в одной JVM, что кажется невозможным - вы можете только создать его.

Ответ 3

Другой случай, когда вы можете увидеть ту же ошибку, - это Spark REPL конечной точки dev AWE Glue, когда вы пытаетесь преобразовать динамический кадр в фреймворк данных.

На самом деле существует несколько различных исключений, таких как:

  • 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

Решение сложно найти с помощью google, но в конце концов оно описано здесь.

Загруженный 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

Я столкнулся с той же проблемой при создании таблицы.

sqlContext.sql("CREATE TABLE....

Я мог видеть много записей для ps -ef | grep spark-shell, поэтому я убил их всех и перезапустил spark-shell. Это сработало для меня.

Ответ 5

Если вы столкнулись с проблемой при запуске приложения WAS на машине Windows:

  • убить java-процессы с помощью диспетчера задач
  • удалить db.lck файл, присутствующий в WebSphere\AppServer\profiles\AppSrv04\databases\EJBTimers\server1\EJBTimerDB (моя БД - EJBTimerDB, вызывающая проблему)
  • перезапустить приложение.

Ответ 6

Это произошло, когда я использовал pyspark ml Word2Vec. Я пытался загрузить ранее построенную модель. Trick, просто создайте пустой фрейм данных pyspark или scala с помощью sqlContext. Ниже приведен синтаксис python -

from pyspark.sql.types import StructType

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

Это обходной путь. Моя проблема исправлена ​​после использования этого блока. Примечание. Это происходит только при создании экземпляра sqlContext из HiveContext, а не SQLContext.

Ответ 7

Я получил эту ошибку, запустив 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)) Таким образом, вы можете запустить это, прежде чем восстанавливать его, но FYI я видел, как другие сообщают об этом, это им не помогло.

Ответ 8

Ошибка возникла из-за многократной искровой оболочки, которую вы пытаетесь запустить в том же node, или из-за сбоя системы, ее закрытие без надлежащего выхода из искровой оболочки. По любой причине вы просто обнаруживаете идентификатор процесса и убить их, для нас

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

Ответ 9

lck (lock) файл - это файл контроля доступа, который блокирует базу данных, так что только один пользователь может получить доступ к базе данных или обновить ее. Ошибка предполагает, что есть другой экземпляр, который использует ту же базу данных. Таким образом вам нужно удалить файлы .lck. В вашем домашнем каталоге перейдите к metastore_db и удалите все файлы .lck.

Ответ 10

очень сложно найти, где ваш derby metastore_db имеет доступ другим потоком, если вы можете найти этот процесс, тогда вы можете убить его с помощью команды kill.

Лучшие решения для перезапуска системы.