SpringBoot工程通过jdbc连接Hive

本文介绍了在使用SpringBoot通过jdbc连接Hive时遇到的NoClassDefFoundError问题,原因是缺少Hadoop-common依赖。解决方案是引入与Hive版本匹配的Hadoop-common包,并排除不必要的日志依赖。最终通过添加正确版本的Hadoop依赖,成功解决了连接问题,使得Demo能够正常运行。

首先确定当前hive的版本

例如:我目前的版本就是
hive-common-1.1.0-cdh5.16.2.jar

注意:引入的Hive-jdbc依赖需与Hive版本保持一致。

依次对应hive-common-1.1.0引入的Hive-jdbc版本为1.1.0(其中排除log4j依赖是为了解决原工程引入Hive依赖后导致日志不输出问题)

<dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
       <version>1.1.0</version> 
            <exclusions>
                <exclusion>
                    <groupId>org.eclipse.jetty.aggregate</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-slf4j-impl</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.log4j</groupId>
                    <artifactId>org.apache.hive.org.apache.log4j</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

关引入Hive-jdbc1.1.0再去尝试连接同样会发生报错

报错信息如下

java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration

    at org.apache.hive.jdbc.HiveConnection.createBinaryTransport(HiveConnection.java:393)
    at org.apache.hive.jdbc.HiveConnection.openTransport(HiveConnection.java:187)
    at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:163)
    at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at com.hundsun.duqa.admin.api.service.DuqaHiveJDBCTest.test2(DuqaHiveJDBCTest.java:42)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 35 more

产生错误的原因是我们需要同样引入Hadoop-common包,这里我选择的是2.6.5

<dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.6.5</version>
            <exclusions>
                <exclusion>
                    <artifactId>servlet-api</artifactId>
                    <groupId>javax.servlet</groupId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-slf4j-impl</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.log4j</groupId>
                    <artifactId>org.apache.hive.org.apache.log4j</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

再去测试我们的Demo,成功了!

Demo代码如下:

public void test2() throws Exception{
        // 注册数据库驱动,用的hive的jdbc,驱动名固定写死
        Class.forName("org.apache.hive.jdbc.HiveDriver");
        // 如果用的是hive2服务,则写jdbc:hive2,后面跟上hive服务器的ip以及端口号,端口号默认是10000
        Connection conn = DriverManager.getConnection("jdbc:hive2://1服务器IP:10000/库名", "用户名", "密码");
        Statement stat = conn.createStatement();
        ResultSet rs = stat.executeQuery("select api_id from idc.ods_duas_data_services_mng where thedate =  '20220424' and api_id regexp 'companyInfo'");
        while (rs.next()) {
            String api_id = rs.getString("api_id");
            System.out.println(api_id);
        }
        stat.close();
        conn.close();
    }

完美解决SpringBoot通过jdbc连接Hive问题!

如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,,咱们下期见。

收藏 等于白嫖,点赞才是真情。

 

<think>嗯,用户现在想了解如何配置Flink SQL通过JDBC连接Hive。我需要先回忆一下Flink和Hive集成的相关知识。记得Flink通常通过HiveConnector来连接Hive,使用的是HiveCatalog,而不是直接通过JDBC。不过用户可能希望用JDBC的方式,可能是因为他们现有的环境或者特定的需求?首先,应该确认Flink是否支持通过JDBC连接Hive。一般来说,HiveConnector默认可能使用Hive Metastore的Thrift服务,而不是JDBC。但用户可能想用HiveJDBC驱动,比如通过Flink的JDBCConnector连接HiveServer2。这时候需要查阅Flink文档,看看JDBC Connector是否支持Hive,或者是否有其他配置方法。然后,可能需要配置HiveJDBC URL,比如jdbc:hive2://host:port/database。同时,Flink的JDBCConnector需要对应的驱动依赖,比如hive-jdbc.jar。要提醒用户添加相关依赖到Flink的lib目录,或者在SQL客户端中上传JAR。接下来,创建Flink表时使用JDBC连接器,指定driver、url、table-name等参数。例如,使用CREATE TABLE语句,CONNECTOR属性为'jdbc',并配置必要的参数。同时,需要注意Flink的JDBCConnector是否支持读写Hive表,可能只支持查询,或者需要特定配置。另外,用户可能需要使用HiveModule来支持Hive的内置函数,这样在Flink SQL中可以调用Hive的函数。需要引用相关的文档说明,比如HiveModule的配置方法。还要考虑权限问题,比如HiveServer2的访问权限,以及Flink集群的网络配置是否能连接HiveServer2的端口。可能需要配置用户名和密码,或者在URL中添加认证信息。最后,给出一个具体的示例,包括依赖配置、Flink SQL建表语句,以及查询示例。同时,提醒用户注意版本兼容性,比如Flink和Hive的版本是否匹配,驱动是否兼容。总结步骤:添加依赖、配置JDBC连接参数、创建表、启用HiveModule(可选)、执行查询。同时,指出可能的常见问题,比如驱动类找不到、连接超时等,并给出解决建议。</think>### Flink SQL通过JDBC连接Hive的配置方法 #### 1. 环境准备 - **依赖添加**:需在Flink的`lib/`目录下添加以下JAR文件: - Hive JDBC驱动:`hive-jdbc-{version}.jar`(如Hive 3.x对应`hive-jdbc-3.1.2.jar`) - Hadoop核心库:`hadoop-common-{version}.jar` - Flink JDBC Connector:`flink-connector-jdbc_2.12-1.14.4.jar` - 示例Maven依赖: ```xml <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>3.1.2</version> </dependency> ``` #### 2. SQL客户端配置 ```sql -- 启用Hive方言(可选) SET table.sql-dialect=hive; -- 创建JDBC连接表 CREATE TABLE hive_jdbc_table ( id INT, name STRING ) WITH ( 'connector' = 'jdbc', 'url' = 'jdbc:hive2://hiveserver2_host:10000/default', 'driver' = 'org.apache.hive.jdbc.HiveDriver', 'table-name' = 'hive_source_table', 'username' = 'hive_user', 'password' = 'hive_pass' ); -- 启用Hive函数支持(需提前加载HiveModule) LOAD MODULE hive; ``` #### 3. 参数说明 | 参数 | 必选 | 说明 | |---------------|------|----------------------------------------------------------------------| | connector | 是 | 固定值`jdbc` | | url | 是 | Hive JDBC连接地址,格式:`jdbc:hive2://<host>:<port>/<database>` | | driver | 是 | JDBC驱动类名,Hive固定为`org.apache.hive.jdbc.HiveDriver` | | table-name | 是 | Hive中的源表名 | | username | 否 | 连接HiveServer2的用户名 | | password | 否 | 对应用户的密码 | | scan.fetch-size | 否 | 批量读取行数,默认1024 | #### 4. 查询示例 ```sql SELECT * FROM hive_jdbc_table WHERE id > 100; ``` #### 5. 注意事项 1. **HiveServer2服务状态**:需确保HiveServer2服务已启动且端口可访问 2. **Kerberos认证**:若集群启用Kerberos,需额外配置JAAS文件[^2] 3. **数据写入限制**:Flink JDBC Connector主要设计用于查询,写入Hive建议使用原生Hive Connector[^1] 4. **数据类型映射**:需手动确保Hive表字段类型与Flink定义的类型兼容
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值