#apache-spark #jupyter-notebook #delta-lake
Вопрос:
Использование «spark.sql.warehouse.dir» в том же сеансе jupyter (без ссылок на данные) работает. Но после перезапуска ядра в jupyter база данных каталога и таблицы больше не распознаются. Разве невозможно добиться независимости сеанса с помощью логики метастора с помощью дельта-озера за пределами баз данных (я знаю возможность использования пути)?
Спасибо, Кристиан
spark = (
SparkSession.builder
.appName("tmp")
.config("spark.jars.packages", "io.delta:delta-core_2.12:1.0.0")
.config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension")
.config(
"spark.sql.catalog.spark_catalog",
"org.apache.spark.sql.delta.catalog.DeltaCatalog",
)
.config("spark.sql.warehouse.dir", "/home/user/data")
.getOrCreate()
)
df = spark.range(100)
df.write.format("delta").mode("overwrite").saveAsTable("rnd")
spark.sql("Select * from rnd").show()
spark.catalog.listDatabases()
spark.catalog.listTables()
Ответ №1:
Databricks использует метастор Hive, если вы хотите иметь тот же рабочий процесс, что и с Databricks, настройка экземпляра Hive-ваш лучший вариант. Вы можете сделать это локально, если хотите/нуждаетесь, я проверил это, это работает.
Кроме этого, вы можете попытаться поиграть с spark.catalog для хранения информации об этих таблицах и базах данных в каком-либо файле, а затем перезагружать каждый раз, когда вы начинаете новый сеанс, но я бы не рекомендовал этого делать.
В любом случае, насколько мне известно, нет централизованного метастора Дельты, кроме Улья.
Обновить
Так что я был неправ. Я изучил это, и оказалось, что Spark использует внутреннее хранилище метастазов, и по умолчанию используется Derby. НО есть простой способ определить базу данных метастазов улья, которая будет управляться внутри Spark. При этом вам не нужно настраивать Hadoop и Hive, все, что вам нужно, — это база данных. Вы можете настроить его для какого-либо экземпляра общей базы данных или настроить локально. Моим выбором был MySQL, работающий в docker, но это зависит от вас. Ниже приведен мой пример создания нового сеанса SparkSession с экземпляром MySQL в качестве хранилища метастазов, но было бы разумнее сохранить конфигурации этого соединения в файле spark-defaults.conf или, еще лучше, в каком-нибудь безопасном месте.
spark = SparkSession.builder.appName("metastore test")
.config("spark.hadoop.javax.jdo.option.ConnectionURL", "jdbc:mysql://localhost:3306/metadata_db")
.config("spark.hadoop.javax.jdo.option.ConnectionUserName", "user")
.config("spark.hadoop.javax.jdo.option.ConnectionPassword", "password")
.config("spark.hadoop.javax.jdo.option.ConnectionDriverName", "com.mysql.cj.jdbc.Driver")
.config("spark.sql.warehouse.dir", "/path/to/warehouse")
.enableHiveSupport().getOrCreate()
Примечания
Просто убедитесь, что вы создали пользователя базы данных, доступ к которому можно получить из Spark, и у вас есть драйвер для вашей базы данных.
У меня также была небольшая проблема с отсутствием схемы улья в MySQL, поэтому я выполнил создание схемы вручную из сценария, который можно найти здесь: https://github.com/apache/hive/tree/master/metastore/scripts/upgrade/mysql
Вот некоторый контекст во внешнем каталоге Spark, с которым я столкнулся https://jaceklaskowski.gitbooks.io/mastering-spark-sql/content/spark-sql-ExternalCatalog.html
Конечно, вы можете изменить этот конструктор для реализации Delta suport.
Комментарии:
1. спасибо за разъяснение