Spark 3.0.1后续会话无法读取已持久化的spark warehouse数据库如何解决
Spark 3.0.1 本地持久化Warehouse配置方案
问题根因
你当前的配置只指定了数据存储的warehouse路径,没有配置持久化的元数据存储:Spark默认未启用Hive支持时,使用会话级临时Derby数据库存储库表元数据,会话结束后元数据会自动销毁。Spark的catalog不会主动扫描warehouse目录下的.db文件夹,只会从元数据库读取库表信息,因此新会话无法识别之前创建的数据库。空的.db文件夹属于正常现象,空数据库本身不会生成额外文件,只有写入表后才会生成对应数据文件。
完整配置步骤
1. 新增核心配置项
创建Spark会话时必须启用Hive支持,同时配置Derby元数据库的持久化存储路径,不需要额外安装Hive服务:
# PySpark 配置示例 from pyspark.sql import SparkSession spark = SparkSession.builder \ # 你原有配置的warehouse路径保持不变 .config("spark.sql.warehouse.dir", "C:/path/to/my/long/lived/mock-hive") \ # 新增:配置持久化Derby元数据库的存储路径 .config("javax.jdo.option.ConnectionURL", "jdbc:derby:;databaseName=C:/path/to/my/long/lived/metastore_db;create=true") \ # 必须启用Hive支持才会使用持久化元数据 .enableHiveSupport() \ .getOrCreate()
Scala/Java版本仅语法差异,配置项完全一致。
2. 验证持久化生效
执行测试代码验证效果:
-- 创建库、写入测试表 spark.sql("CREATE DATABASE IF NOT EXISTS db1") spark.sql("USE db1") spark.range(10).write.saveAsTable("test_table")
关闭当前Spark会话,使用完全相同的配置重新启动新会话后,执行以下命令即可看到历史创建的数据库:
spark.catalog.listDatabases().show() # 查询历史写入的表数据也会正常返回 spark.sql("SELECT * FROM db1.test_table").show()
注意事项
- 首次启动配置前如果本地有临时生成的
metastore_db文件夹,建议先删除避免元数据冲突 - 本地Derby元数据库默认不支持多进程并发写入,仅适合本地单线程测试场景;如果需要多并发访问,可以将元数据库替换为MySQL,修改
javax.jdo.option.ConnectionURL、javax.jdo.option.ConnectionDriverName、javax.jdo.option.ConnectionUserName、javax.jdo.option.ConnectionPassword四个配置项即可 - 空数据库对应的.db文件夹为空属于正常现象,不影响元数据识别
内容的提问来源于stack exchange,提问作者Rimer
相关产品推荐
相关产品推荐

