pyspark delta-lake 元存储

Posted

技术标签:

【中文标题】pyspark delta-lake 元存储【英文标题】:pyspark delta-lake metastore 【发布时间】:2021-09-17 20:26:45 【问题描述】:

在同一个 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()

【问题讨论】:

【参考方案1】:

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

注意事项

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

我还遇到了一个小问题,即 MySQL 中缺少 Hive 架构,因此我从可以在此处找到的脚本手动执行架构创建:https://github.com/apache/hive/tree/master/metastore/scripts/upgrade/mysql

这是我遇到的关于 Spark 的 ExternalCatalog 的一些上下文https://jaceklaskowski.gitbooks.io/mastering-spark-sql/content/spark-sql-ExternalCatalog.html

当然你可以修改这个构建器来实现 Delta 支持。

【讨论】:

感谢您的澄清

以上是关于pyspark delta-lake 元存储的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Pyspark 访问外部 Hive 元存储

在 s3 pyspark 作业中创建单个镶木地板文件

pyspark 为自定义模块返回名为错误的无模块

我只需要在 pyspark 数据框中附加那些具有非空值的人

pyspark.sql 无法实例化 HiveMetaStoreClient - noclassfound from org.apache.commons.dbcp.connectionfactory

需要通过类似于 scipy.linalg.eig 的特征值分解在 pyspark 中找到非对称方阵的特征向量