JDBC 连接 hive2 遇到的java.lang.ClassNotFoundException: org.apache.hive.jdbc.HiveDriver

本文介绍了一个简单的Java程序,使用JDBC连接Hive2并执行查询操作。程序通过加载Hive驱动、建立连接、执行SQL语句来获取结果,并展示了在不同环境下可能遇到的问题及两种解决方案。

JDBC 连接hive2, 程序挺简单, 跟其他数据库查询类似, 连接/执行查询/得到结果

package hive.server2.query;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class ApiQueryTest {
	private static String driverName = "org.apache.hive.jdbc.HiveDriver";

	public static void main(String[] args){
		try {
			Class.forName(driverName);
			Connection con = null;
			con = DriverManager.getConnection("jdbc:hive2://10.68.128.215:10000", "root", "WoLeGeQu");
			Statement stmt = con.createStatement();
			ResultSet res = null;
			String sql = "select * from api_logs";
			System.out.println("Running: " + sql);
			res = stmt.executeQuery(sql);
			System.out.println("ok");
			while (res.next()) {
				System.out.println(res.getString(1) + "\t" + res.getString(2) + "\t" +  res.getString(3) + "\t" +  res.getString(4));
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("error");
		}

	}
}

本地 MyEclipse10, Ctrl+F11 运行正常, 但打包到虚拟机下就不行了, 报错:
[root@localhost test]# java -jar HiveQueryTest.jar 
java.lang.ClassNotFoundException: org.apache.hive.jdbc.HiveDriver
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:191)
        at hive.server2.query.ApiQueryTest.main(ApiQueryTest.java:24)
error

说找不到org.apache.hive.jdbc.HiveDriver,  想写个shell, 把 $HIVE_LIB目录下jar 都加到CLASSPATH应该行了吧, 结果还是报这个, 都没道理了...

解决办法 1

改成了MANIFEST.MF 加Class-Path, 把需要的jar包的写在这里, 结果OK, 需要注意的是, Class-Path: 冒号后面需要一个空格, 否则会报错:

Error: Invalid or corrupt jarfile HiveQueryTest.jar

Class-Path 后面加上两个jar 包基本就可以:

Class-Path: /home/hive/apache-hive-2.1.0-bin/test/lib/hive-jdbc-2.1.0-standalone.jar /home/hive/apache-hive-2.1.0-bin/test/lib/hadoop-common-2.7.0.jar

再次上传, 运行OK

解决办法 2

 讲程序与依赖的包一起打包 , 在Export 对话框中选择: Runnable JAR file 也可以

<think>好的,我现在需要解决用户遇到的Hive JDBC驱动程序导致的ClassNotFoundException问题,特别是org.apache.hive.jdbc.HiveDriver找不到的情况。用户提到在Sqoop执行create-hive-table时出现错误,还引用了几个相关的异常信息。我需要逐步分析可能的原因,并提供对应的解决方案。 首先,用户遇到的错误是java.lang.ClassNotFoundException,这说明在运行时JVM找不到指定的类。具体来说,HiveDriver类没有被正确加载。这种情况通常发生在缺少相关的JAR文件或者类路径配置不正确的情况下。接下来,我需要考虑以下几个可能的原因: 1. **缺少Hive JDBC驱动程序JAR文件**:用户可能在项目的依赖中没有包含HiveJDBC驱动,或者版本不兼容。Hive JDBC驱动通常位于Hive的安装目录下的lib文件夹中,比如hive-jdbc-*.jar。需要确认是否已经将该JAR文件添加到类路径中。 2. **类名拼写错误**:用户提供的驱动类名是否正确?在引用中,用户提到两种不同的驱动类名:org.apache.hadoop.hive.jdbc.HiveDriver(引用1和引用3)和org.apache.hive.jdbc.HiveDriver(引用3中的代码)。这里可能存在混淆,因为不同版本的Hive可能使用了不同的驱动类名。需要检查驱动类名是否正确,是否与所使用的Hive版本对应。 3. **构建工具配置问题**:如果用户使用Maven或Gradle等构建工具,可能需要检查pom.xml或build.gradle文件中是否正确声明了Hive JDBC的依赖,并且版本是否匹配。 4. **环境变量或类路径配置错误**:在运行程序时,是否通过-classpath参数正确指定了Hive JDBC驱动的位置?特别是在使用命令行工具如Sqoop时,可能需要手动添加驱动路径到HADOOP_CLASSPATH或SQOOP_HOME/lib目录下。 5. **版本兼容性问题**:Hive JDBC驱动版本与Hive服务器版本是否兼容?不同版本的驱动可能存在类名或方法的变化,导致找不到类的情况。 接下来,我需要逐一分析这些可能性,并给出对应的解决步骤。 对于第一个原因,缺少JAR文件,用户需要确认是否已经下载并添加了正确的Hive JDBC驱动。例如,对于Hive 2.x版本,驱动类名通常是org.apache.hive.jdbc.HiveDriver,对应的JAR文件可能包括hive-jdbc-standalone-*.jar。如果用户使用的是旧版本的Hive,可能需要使用旧版的驱动类名,如org.apache.hadoop.hive.jdbc.HiveDriver。因此,检查Hive版本和驱动类名的对应关系是关键。 其次,类名拼写错误的问题,用户需要仔细检查代码中DriverManager.getConnection时使用的驱动类名是否正确。例如,引用3中的代码使用了"org.apache.hive.jdbc.HiveDriver",而引用1和引用2提到的异常可能涉及不同版本的类名。因此,需要确认驱动类名与Hive版本一致,并正确加载。 关于构建工具配置,如果用户使用Maven,可以在pom.xml中添加如下依赖(以Hive 2.3.9为例): ```xml <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>2.3.9</version> </dependency> ``` 但需要注意,Hive的依赖可能涉及多个JAR文件,并且可能有与其他Hadoop组件的版本冲突,需要确保所有依赖版本一致。 对于环境变量或类路径的问题,特别是在使用Sqoop时,可能需要手动将HiveJDBC驱动JAR文件复制到Sqoop的lib目录下,或者通过HADOOP_CLASSPATH环境变量指定其路径。例如: ```bash export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/path/to/hive-jdbc-*.jar ``` 或者在运行Sqoop命令时通过--driver参数指定驱动类,并确保JAR文件在类路径中。 版本兼容性方面,用户需要确认Hive服务器版本和客户端驱动版本是否匹配。例如,Hive 3.x的驱动可能与Hive 2.x不兼容,导致类找不到的错误。因此,建议用户检查Hive的官方文档,确认驱动类名和依赖版本的正确性。 此外,用户可能在代码中未正确加载驱动类。在Java中,通常需要使用Class.forName()来显式加载驱动类,例如: ```java Class.forName("org.apache.hive.jdbc.HiveDriver"); ``` 如果这一步被遗漏,或者类名错误,也会导致ClassNotFoundException。因此,检查代码中是否包含正确的驱动加载语句是必要的。 总结解决步骤大致如下: 1. 确认Hive JDBC驱动JAR是否存在并正确添加到类路径。 2. 检查驱动类名是否与Hive版本匹配。 3. 确保构建工具或环境变量正确配置依赖。 4. 验证版本兼容性,必要时升级或降级驱动版本。 5. 检查代码中是否正确加载驱动类。 最后,还需要参考用户提供的引用信息,比如引用3中提到用户代码中的驱动类名为"org.apache.hive.jdbc.HiveDriver",但出现异常,可能是因为该驱动类存在于hive-jdbc的JAR中,但未被正确引入。因此,用户需要确认该JAR文件是否在项目中可用,并且路径正确。 可能还需要考虑Hive的依赖是否与其他Hadoop组件的依赖冲突,比如hive-exec、hive-service等,是否存在版本不一致的问题。这时候可能需要排除冲突的依赖,或者统一版本号。 如果用户在集群环境中运行程序,比如通过YARN提交任务,可能需要将Hive的JAR文件分发到各个节点,或者包含在应用程序的JAR包中。 另外,Sqoop在连接Hive时可能需要特定的配置,比如--hive-import等参数,以及正确配置Hive的元数据存储和HiveServer2的地址。如果Sqoop的配置有误,也可能间接导致驱动类加载失败,需要综合检查Sqoop命令的参数和Hive服务的状态。 总之,解决该问题需要系统性地检查依赖管理、类路径配置、驱动类名正确性以及版本兼容性等方面,逐步排查可能的原因,并逐一验证解决方案。</think>### 解决步骤 #### 1. 确认驱动类名与Hive版本对应关系 - **Hive 1.x及早期版本**:使用驱动类名 `org.apache.hadoop.hive.jdbc.HiveDriver`[^3] - **Hive 2.x/3.x**:使用驱动类名 `org.apache.hive.jdbc.HiveDriver`[^3] 检查代码中是否声明了正确的驱动类名,例如: ```java Class.forName("org.apache.hive.jdbc.HiveDriver"); // Hive 2.x/3.x // 或 Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver"); // Hive 1.x ``` #### 2. 添加Hive JDBC依赖 根据构建工具选择对应方式: - **Maven项目**:在 `pom.xml` 中添加: ```xml <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>与Hive服务端一致的版本号</version> <!-- 例如3.1.3 --> </dependency> ``` 需确保版本与Hive服务端完全一致[^3]。 - **手动添加JAR**:从Hive安装目录的 `lib` 文件夹中获取以下文件: ``` hive-jdbc-*.jar hive-service-*.jar hadoop-common-*.jar # 依赖的Hadoop库 ``` 通过 `-classpath` 参数加载,例如: ```bash java -cp "/path/to/hive-jdbc.jar:/path/to/hadoop-common.jar" YourClassName ``` #### 3. 配置Sqoop的类路径 若通过Sqoop操作Hive时报错,需将Hive JDBC驱动复制到Sqoop的 `lib` 目录: ```bash cp /path/to/hive-jdbc-*.jar $SQOOP_HOME/lib/ ``` 并重启Sqoop服务[^2]。 #### 4. 验证依赖冲突 使用 `mvn dependency:tree` 检查是否存在版本冲突,例如: ```bash mvn dependency:tree | grep 'hive\|hadoop' ``` 若存在冲突,需在 `pom.xml` 中排除旧版本依赖: ```xml <exclusions> <exclusion> <groupId>org.apache.hive</groupId> <artifactId>hive-service</artifactId> </exclusion> </exclusions> ``` #### 5. 显式加载驱动类 在Java代码中强制加载驱动: ```java public class HiveDemo { static { try { Class.forName("org.apache.hive.jdbc.HiveDriver"); // 根据版本调整 } catch (ClassNotFoundException e) { e.printStackTrace(); System.exit(1); } } } ``` ### 完整操作示例 以Maven项目连接Hive 3.1.3为例: 1. **添加依赖**: ```xml <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>3.1.3</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.3.6</version> <!-- 与Hadoop集群版本一致 --> </dependency> ``` 2. **Java连接代码**: ```java import java.sql.Connection; import java.sql.DriverManager; public class HiveConnector { public static void main(String[] args) { try { Class.forName("org.apache.hive.jdbc.HiveDriver"); Connection conn = DriverManager.getConnection( "jdbc:hive2://hive-server:10000/default", "username", "password" ); System.out.println("连接成功"); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` ### 附录:Hive驱动版本对照表 | Hive版本 | 驱动类名 | 依赖坐标 | |----------|----------------------------------------|---------------------------------------| | 1.x | `org.apache.hadoop.hive.jdbc.HiveDriver` | hive-jdbc:1.2.2 | | 2.x | `org.apache.hive.jdbc.HiveDriver` | hive-jdbc:2.3.9 | | 3.x | `org.apache.hive.jdbc.HiveDriver` | hive-jdbc:3.1.3 |
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值