You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:52:43