pyspark delta-lake 元存储

Chr*_*ian 5 apache-spark jupyter-notebook delta-lake

在同一个 jupyter 会话(无数据块)中使用“spark.sql.warehouse.dir”是有效的。但是在 jupyter 中重新启动内核后,目录数据库和表不再被识别。是否可以使用元存储逻辑与数据块外部的 delta-lake 来实现会话独立性(我知道使用路径的可能性)?

谢谢,克里斯蒂安


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()

Run Code Online (Sandbox Code Playgroud)

Dan*_*Dev 3

Databricks 使用 Hive 元存储,如果您想拥有与 Databricks 相同的工作流程,设置 Hive 实例是您的最佳选择。如果您愿意/需要,您可以在本地进行,我检查过,它有效。

除此之外,您可以尝试使用 Spark.catalog 将这些表和数据库上的信息存储到某个文件中,然后在每次启动新会话时重新加载,但我不建议这样做。

不管怎样,据我所知,除了 Hive 之外,没有 Delta 集中式元存储。

更新

Spark 内置了元存储,默认为 Derby。有一种简单的方法来定义 Hive 元存储数据库,该数据库将由 Spark 内部管理。有了这个,您就不必设置 Hadoop 和 Hive,您所需要的只是一个数据库。您可以为某些共享数据库实例配置它,或者在本地设置它。我的选择是在 docker 中运行 MySQL,但这取决于你。下面是我使用 MySQL 实例作为元存储创建新 SparkSession 的示例,但将此连接配置保留在 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()
Run Code Online (Sandbox Code Playgroud)

笔记

只需确保您已创建可以从 Spark 访问的数据库用户,并且拥有数据库的驱动程序。

我还缺少 MySQL 中的 Hive 模式,因此我从可以在此处找到的脚本手动执行模式创建: 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 支持。