Spark与Hive集成报错:数据库practise未找到求助
问题排查与解决方案
核心问题分析
你遇到的NoSuchDatabaseException本质是Spark无法读取Hive的元数据,或是配置指向的warehouse路径与Hive实际使用的不一致,导致找不到practise数据库。以下是具体排查步骤和修复方案:
排查步骤与修复
1. 确认Hive配置文件的正确性
- 确保你复制到
/usr/local/spark/conf/的hive-site.xml是集群上Hive的真实配置文件(默认路径为/etc/hive/conf/hive-site.xml),而非Windows本地的文件。 - 检查
hive-site.xml中的关键配置:hive.metastore.warehouse.dir:确认值为/user/hive/warehouse/(与Hive实际使用的路径一致)hive.metastore.uris:确保指向正确的元存储服务,Cloudera默认值为thrift://localhost:9083
- 若配置文件有误,重新复制后直接重新提交任务即可。
2. 修正SparkSession配置
你的代码中手动创建SparkConf并设置spark.sql.warehouse.dir,可能覆盖了Hive配置中的路径,导致Spark找不到Hive创建的数据库。调整要点:
- 移除手动创建的
SparkContext,SparkSession会自动管理上下文 - 不要手动指定
spark.sql.warehouse.dir,让Spark从hive-site.xml读取正确路径 - 直接通过SparkSession Builder构建上下文并启用Hive支持
3. 检查HDFS权限
执行以下命令确认practise数据库的HDFS目录存在且有权限:
hdfs dfs -ls /user/hive/warehouse/practise.db
如果目录不存在或无权限,执行:
# 若目录不存在,先通过Hive Shell重新创建数据库(确保Hive能正常写入) hive -e "create database if not exists practise;" # 调整目录权限 hdfs dfs -chmod -R 755 /user/hive/warehouse/practise.db
4. 确认依赖兼容性
- 确保Maven依赖的Spark版本与Cloudera集群的Spark版本一致(CDH 5.12适配Spark 2.3.1是可行的)
- 打包时将Spark相关依赖设为
provided,避免与集群依赖冲突:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_2.11</artifactId> <version>2.3.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-avro_2.11</artifactId> <version>2.3.1</version> <scope>provided</scope> </dependency>
修改后的完整代码(含Avro写入)
package sparkhiveintegration_package_spark import org.apache.spark.sql.SparkSession object objSparkHiveIntegration { def main(arg: Array[String]): Unit = { // 直接通过SparkSession Builder构建,自动读取Hive配置 val ssc = SparkSession.builder() .appName("SparkHiveIntegrationTest") .enableHiveSupport() .getOrCreate() ssc.sparkContext.setLogLevel("Error") import ssc.implicits._ // 直接指定库名查询,避免切换库可能的问题 val sprk_hve_read_df = ssc.sql("select * from practise.customers") sprk_hve_read_df.show() // 将数据写入HDFS为Avro格式 sprk_hve_read_df.write .format("avro") .mode("overwrite") .save("/user/cloudera/sprk_hive_integration/avro_output") ssc.stop() } }
提交命令优化
提交时无需指定--master local[*](若要在集群分布式运行,可改为--master yarn),让集群自动分配资源:
spark-submit --class sparkhiveintegration_package_spark.objSparkHiveIntegration /home/cloudera/externalJars/SparkRDDPractiseSession-0.0.1-SNAPSHOT.jar
内容的提问来源于stack exchange,提问作者Rajarshi Maity
相关产品推荐
相关产品推荐

