【问题标题】:pyspark delta-lake metastorepyspark delta-lake 元存储
【发布时间】: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()

【问题讨论】:

    标签: apache-spark jupyter-notebook delta-lake


    【解决方案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 支持。

    【讨论】:

    • 感谢您的澄清
    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    相关资源
    最近更新 更多