spark 3.0 集成外部hive数仓报错: java.lang.NoSuchMethodError: org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy

目录

    一、软件版本

    组件 版本号
    hadoop 3.1.3
    spark 3.0.0
    scala 2.12
    mysql 8.0
    hive 3.1.2

    二、配置spark-shell查询外置hive数仓的步骤, 验证hive服务环境是否正常

    • 拷hive-site.xml文件到spark_home/conf目录下

    • 拷mysql驱动包放到spark_home/jars目录下

    • 启动spark-shell终端环境, 查询hive:执行show tables命令,可得到正确结果,说明hive服务可被远程连接

    三、配置spark代码程序查询外置hive数仓

    • 将hive-site.xml放到工程的resources目录先

    • 引入maven 依赖

        <properties>
            <scala.version>2.12</scala.version>
            <spark.version>3.0.0</spark.version>
            <mysql.version>8.0.16</mysql.version>
            <hive.version>3.1.2</hive.version>
        </properties>
    
    
        <dependencies>
            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-core_${scala.version}</artifactId>
                <version>${spark.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-sql_${scala.version}</artifactId>
                <version>${spark.version}</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-hive_${scala.version}</artifactId>
                <version>${spark.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.hive</groupId>
                <artifactId>hive-exec</artifactId>
                <version>${hive.version}</version>
            </dependency>
    
        </dependencies>
    
    • 代码启用hive
    import org.apache.spark.SparkConf
    import org.apache.spark.sql.SparkSession
    
    object Demo07 {
    
        def main(args: Array[String]): Unit = {
    
            val conf: SparkConf = new SparkConf()
                .setMaster("local[*]")
                .setAppName("spark-使用外置hive数据源")
    
            val sess: SparkSession = SparkSession.builder()
                .enableHiveSupport()   // 启用hive
                .config(conf).getOrCreate()
    
            sess.sql("show tables;").show()
            sess.close()
        }
    }
    
    
    • 程序查询验证

    • 为什么找不到spark-hive_2.12:3.0.0(报红)

    • 依赖下载失败: 不是

    • 可以肯定的是: 版本不一致/不兼容. (pom文件的组件版本都和安装的版本一致且maven 仓库存在)
      原因: spark所支持内置的hive的版本号与依赖版本号不兼容所致

    spark默认便支持hive,也就是内置了hive,最初是1.2.1,
    spark加载hive相关jar的3中方式:
    builtin(默认):即使在代码中显示指定了配置项spark.sql.hive.metastore.version,也只能是1.2.1;否则抛出异常.
    maven:其实就是pom.xml中的依赖
    其它:配置项spark.sql.hive.metastore.version指明的是jar包目录路径,而非版本号
    
    • 手动添加一行代码, 查看异常信息. 这里源码给出的建议是: 2.3.7而非1.2.1, 可能是spark为了兼容高版本的hive而升级了版本号.

    • 处理:将hive-exec版本降级到指定版本即可,<hive.version>2.3.7</hive.version>

    posted @ 2022-06-18 14:38  UsingStuding  阅读(1332)  评论(0)    收藏  举报