писпарк дельта-озеро метастор

#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. спасибо за разъяснение