Spark独立模式下复用外部表:spark-submit与shell行为不一致求解
解决Spark独立模式下spark-submit表元数据持久化问题
核心原因
spark-shell默认会把元数据存在当前启动目录下的metastore_db文件夹,而spark-submit如果不指定固定元数据仓库路径,每次启动会自动使用临时目录存储元数据,导致重启应用后无法找到之前创建的表。
配置方案
给spark-submit添加以下配置参数,让所有应用共享同一个持久化的元数据仓库:
1. 指定统一的元数据仓库路径
在spark-submit命令中添加--conf参数,设置spark.sql.warehouse.dir为HDFS或本地的固定路径(推荐用HDFS保证集群内所有节点可见):
spark-submit \ --conf spark.sql.warehouse.dir=hdfs://xxx/spark-warehouse \ --class your.main.Class \ your-app.jar
提前在HDFS创建该路径并设置权限:
hdfs dfs -mkdir -p hdfs://xxx/spark-warehouse hdfs dfs -chmod 777 hdfs://xxx/spark-warehouse
2. 固定Derby元数据存储目录
Spark默认用Derby做内置元数据库,需要指定它的系统目录,避免每次启动生成临时目录:
spark-submit \ --conf spark.sql.warehouse.dir=hdfs://xxx/spark-warehouse \ --conf spark.driver.extraJavaOptions="-Dderby.system.home=hdfs://xxx/derby-metastore" \ --class your.main.Class \ your-app.jar
同样提前创建Derby目录:
hdfs dfs -mkdir -p hdfs://xxx/derby-metastore hdfs dfs -chmod 777 hdfs://xxx/derby-metastore
3. 验证配置
提交应用后,用spark-shell连接集群执行SHOW TABLES;,应该能看到之前创建的表;再次用spark-submit提交新应用,也能直接查询该表。
额外提示
- Derby不支持多应用并发写入元数据,如果需要多个应用同时操作表,建议单独部署Hive Metastore服务(无需安装完整Hive)。
- 所有Spark应用的
spark.sql.warehouse.dir配置必须一致,否则会出现元数据与数据路径不匹配的问题。
内容的提问来源于stack exchange,提问作者kqboy
相关产品推荐
相关产品推荐

