Причина: ОШИБКА 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..
Мое хранилище метаданных hive включает mysql в качестве хранилища метаданных. Но не уверен, почему ошибка отображается как derby execption


person Aman    schedule 25.12.2015    source источник
comment
Ваш вопрос: я думал, что использую mysql для своего metastore_db, но Spark думает, что я использую Derby. Это почему? Или ваш вопрос: я намеревался использовать Derby для своего metastore_db, но Spark не может открыть базу данных, потому что база данных уже открыта в каком-то другом приложении Derby. Это почему?   -  person Bryan Pendleton    schedule 26.12.2015
comment
Нет... я не хочу использовать дерби... оно выполняется автоматически.... не знаю, почему это ошибка...   -  person Aman    schedule 26.12.2015
comment
Это поможет dataunbox.com/   -  person Aman    schedule 27.07.2020


Ответы (11)


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

Причина: ОШИБКА XSDB6: возможно, другой экземпляр Derby уже загрузил базу данных /metastore_db.

Причина:

Я обнаружил, что это происходит, поскольку несколько других экземпляров Spark-Shell уже запущены и уже содержат базу данных derby, поэтому, когда я запускал еще одну Spark Shell и создавал на ней фрейм данных с помощью RDD.toDF(), он выдавал ошибку:

Решение:

Я запустил команду ps, чтобы найти другие экземпляры Spark-Shell:

ps -ef | grep искровая оболочка

и я убил их всех с помощью команды kill:

kill -9 Spark-Shell-processID (пример: kill -9 4848)

после того, как все экземпляры SPark-Shell исчезли, я запустил новую оболочку SPark SHell и повторно запустил функцию фрейма данных, и все заработало нормально :)

person Dean Jain    schedule 13.07.2016
comment
Уничтожение процесса улья и его перезапуск помогли, спасибо! - person VishnuVardhanA; 26.04.2017
comment
пс-эф | grep искровая оболочка - person Shyam Gupta; 24.05.2017
comment
Это помогло мне. - person pranaygoyal02; 05.09.2018
comment
Этот. spark-shell бежал, хотя я убил iTerm2. Это был интересный феномен. - person WestCoastProjects; 08.02.2019

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

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

person Tzach Zohar    schedule 05.02.2016
comment
Но если оболочка делает это автоматически, как пользователь может избежать этого, чтобы обойти проблему? - person Holger Brandl; 05.09.2017
comment
Пользователю не нужно обходить это — причиной ошибки является попытка пользователя создать другой контекст, вызвав new org.apache.spark.sql.hive.HiveContext(sc) — если вы просто избежите этого, вы ничего не потеряете (потому что у вас уже есть HiveContext, который вы можете использовать) и устранить ошибку. - person Tzach Zohar; 05.09.2017
comment
Проблема в том, что это происходит автоматически с текущей искрой v2.2. Достаточно просто запустить вторую искровую оболочку на той же машине, чтобы вызвать ошибку. - person Holger Brandl; 06.09.2017

Другой случай, когда вы можете увидеть ту же ошибку, — это Spark REPL конечной точки разработки AWS 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()
person newtover    schedule 05.02.2018

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

person ShyamSharma    schedule 10.07.2019
comment
Не зная хаупа, я задаюсь вопросом, дает ли этот вопрос достаточно информации, чтобы быть полезным. Попробуйте отредактировать его и добавить информацию о том, что такое .lck файлы. - person Cleptus; 10.07.2019

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

  1. убить Java-процессы с помощью диспетчера задач
  2. удалить db.lck файл, присутствующий в WebSphere\AppServer\profiles\AppSrv04\databases\EJBTimers\server1\EJBTimerDB (моя БД - это EJBTimerDB, которая вызывала проблему)
  3. перезапустите приложение.
person user3007369    schedule 24.08.2017

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

sqlContext.sql("CREATE TABLE....

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

person Chaitra    schedule 09.11.2017

Это произошло, когда я использовал pyspark мл Word2Vec. Я пытался загрузить ранее построенную модель. Хитрость заключается в том, что просто создайте пустой фрейм данных pyspark или scala, используя sqlContext. Ниже приведен синтаксис Python:

from pyspark.sql.types import StructType

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

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

person Subhojit Mukherjee    schedule 16.10.2017
comment
Вау, у меня это отлично работает, спасибо, я потратил целую вечность, пытаясь загрузить Pipeline.model из pyspark.ml, который я ранее сохранил в другой системе. Вы знаете, что вызывает эту проблему? (тоже незначительная вещь: я пытался отредактировать ваш ответ, чтобы удалить случайную обратную галочку, но StackOverflow не позволил мне, так как редактирование было менее 6 символов). - person Shane Halloran; 08.11.2017

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

person convolutionBoy    schedule 08.04.2016

Я получаю эту ошибку при выполнении тестовых случаев в моей настройке искры с несколькими maven. Я создавал sparkSession в своих тестовых классах отдельно, поскольку для модульных тестов требуются разные параметры искры каждый раз, когда я передаю его через файл конфигурации. Чтобы решить эту проблему, я следовал этому подходу. При создании sparkSession в Spark 2.2.0

//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>
person whoisthis    schedule 18.11.2020
comment
что такое configContent - person vinayak_narune; 04.06.2021

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

[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
person Shyam Gupta    schedule 24.05.2017
comment
Я немного опоздал на вечеринку, но в вашем примере вы только что убили процесс, который вы использовали для поиска процессов. И даже этого уже не было в тот момент, когда вы использовали kill. - person Jochen Niebuhr; 09.08.2018

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

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

person Shyam Gupta    schedule 20.05.2017