上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

SpringBoot 3 集成Hive 3

guduadmin11天前

前提条件:

运行环境:Hadoop  3.* + Hive 3.*  + MySQL 8 ,如果还未安装相关环境,请参考:Hive 一文读懂

Centos7 安装Hadoop3 单机版本(伪分布式版本) 

SpringBoot 2  集成Hive 3

pom.xml 



    
        SpringBootCase
        org.example
        1.0-SNAPSHOT
    
    4.0.0
    SpringBoot-Hive3
    
        8
        8
    
    
        
            org.apache.hive
            hive-jdbc
            3.1.2
            
                
                    slf4j-log4j12
                    org.slf4j
                
                
                    log4j-api
                    org.apache.logging.log4j
                
                
                    log4j-core
                    org.apache.logging.log4j
                
                
                    log4j
                    log4j
                
                
                    log4j-slf4j-impl
                    org.apache.logging.log4j
                
                
                    org.eclipse.jetty
                    jetty-runner
                
            
        
        
            org.springframework.boot
            spring-boot-starter-jdbc
        
    

配置application.properties

server.port=8083
# hive 驱动名称
spring.datasource.driver-class-name=org.apache.hive.jdbc.HiveDriver
# hive 数据库地址 = jdbc:hive2://hive 服务器地址:10000/default(默认数据库名称)
spring.datasource.url=jdbc:hive2://192.168.43.11:10000/default
# hive 服务器用户名
spring.datasource.username=root
# hive  服务器密码
spring.datasource.password=123456

编写Controller和应用入口 

我这边编写一个简单的Controller,打印Hive 默认数据库包含数据库名称。

package cn.zzg.hive.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/hive")
public class HiveController {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @RequestMapping("/list")
    public List> list() {
        String sql = "show databases";
        List> list = jdbcTemplate.queryForList(sql);
        return list;
    }
}
package cn.zzg.hive;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

效果截图:

SpringBoot 3 集成Hive 3,第1张

SpringBoot 2  集成Hive 3 遇到的问题

问题一:Class path contains multiple SLF4J bindings,日志依赖重复冲突。

造成此问题的原因是:spring boot 默认日志为logback, 而引用的hive-jdbc 及其关联jar 使用的日志为 log4j ,造成SLF4J 绑定冲突。

解决办法:移除冲突的日志:log4j

                
                    slf4j-log4j12
                    org.slf4j
                
                
                    log4j-api
                    org.apache.logging.log4j
                
                
                    log4j-core
                    org.apache.logging.log4j
                
                
                    log4j
                    log4j
                
                
                    log4j-slf4j-impl
                    org.apache.logging.log4j
                

问题二:SpringBoot 自带容器Tomcat 与Hive JDBC 关联Jetty 容器冲突

An attempt was made to call the method org.apache.tomcat.util.ExceptionUtils.preload()V but it does not exist. Its class, org.apache.tomcat.util.ExceptionUtils, is available from the following locations:
    jar:file:/E:/maven_repository/org/eclipse/jetty/jetty-runner/9.3.20.v20170531/jetty-runner-9.3.20.v20170531.jar!/org/apache/tomcat/util/ExceptionUtils.class
    jar:file:/E:/maven_repository/org/apache/tomcat/embed/tomcat-embed-core/9.0.12/tomcat-embed-core-9.0.12.jar!/org/apache/tomcat/util/ExceptionUtils.class

解决办法:移除Hive JDBC 依赖的Jetty 容器。

              
                    org.eclipse.jetty
                    jetty-runner
                

问题三:通过JDBC 连接Hive 数据库提示:

java.net.ConnectException: Connection refused 

造成此类 问题的原因:hiveserver2 服务没有正常启动。

解决办法: 切换至hive 安装目录的bin/ 文件夹下(/usr/local/hive/bin),执行如下命令:

# 方式一
hiveserver2 &
# 方式二
hive --service hiveserver2

问题四:访问Hive 数据库,提示无权限问题:

造成此类问题的原因:hadoop 没有配置权限导致。

解决办法:切换至hadoop 安装目录的/etc文件夹下(/usr/local/hadoop/etc/hadoop/core-site.xml),添加如下配置:

         
                hadoop.proxyuser.root.hosts
                *
        
        
                hadoop.proxyuser.root.groups
                *
        

网友评论