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.sql 无法实例化 HiveMetaStoreClient - noclassfound from org.apache.commons.dbcp.connectionfactory