Eclipse JDBC连接Hive 两种方法 hiveserver hiveserver2

环境:CentOS 6.5, Hadoop2.5.1, Hive0.13.1, 使用mysql作为元数据库

安装Hadoop、Hive的过程就不说了,网上一大堆


Eclipse创建项目

创建java项目:HiveJdbcClient

Build Path->Configure Build Path->Libraries,将下列jar包添加到项目中:

$HIVE_HOME/lib下的全部jar包和

/hadoop-2.5.1/share/hadoop/common下所有jar包,及里面的lib目录下所有jar包

/hadoop-2.5.1/share/hadoop/hdfs下所有jar包,不包括里面lib下的jar包

/hadoop-2.5.1/share/hadoop/mapreduce下所有jar包,不包括里面lib下的jar包

/hadoop-2.5.1/share/hadoop/yarn下所有jar包,不包括里面lib下的jar包

Eclipse的环境配置好了,下面说连接方法。

有两种连接方法,第一种是hiveserver,第二种是hiveserver2。我最开始是照着hiveserver的方法连接的,但是有问题,具体什么问题下面会说。


注意:

用户名test,密码123,是管理hadoop的用户。

之前用的是mysql的用户,show tables的时候不会报错,但是select的时候会报错:

java.sql.SQLException: Error while compiling statement: FAILED: RuntimeException Cannot make directory: hdfs://master:9000/tmp/hive-qs714/hive_2016-04-04_21-08-08_931_5820120042748761956-5
无权限创建目录,修改为管理hadoop的用户和密码


连接方法1:hiveserver

1.hive开启端口监听用户的连接:hive --service hiveserver


2.源代码:

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

import org.apache.log4j.Logger;

public class HiveJdbcClient {
	private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";
	private static String url = "jdbc:hive://192.168.69.69:10000/qsjs2016";
	private static String user = "test";
	private static String password = "123";
	private static String sql;
	private static ResultSet res;
	private static final Logger log = Logger.getLogger(HiveJdbcClient.class);

	public static void main(String[] args) {
		try {
			Class.forName(driverName);
			Connection conn = DriverManager.getConnection(url, user, password);
			// 默认使用端口10000, 使用数据库qsjs2016,用户名为test,密码为123
			// Connection conn = DriverManager.getConnection(
			// "jdbc:hive://192.168.69.69:10000/qsjs2016", "test",
			// "123");
			Statement stmt = conn.createStatement();

			sql = "show tables";//显示全部表
			System.out.println("Running:" + sql);
			res = stmt.executeQuery(sql);
			System.out.println("执行结果:");
			while (res.next()) {
				System.out.println(res.getString(1));
			}

			conn.close();
			conn = null;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			log.error(driverName + " not found!", e);
			System.exit(1);
		} catch (SQLException e) {
			e.printStackTrace();
			log.error("Connection error!", e);
			System.exit(1);
		}

	}
}
3.run on hadoop,执行结果:


没有查到表,但是,下图可以看到我的qsjs2016数据库中是有表的。说明查看的是默认数据库default,并没有查qsjs2016这个数据库。url中添加的数据库名没有起作用。


至于为什么会这样我不清楚,网上查了半天并没有查到类似的情况。不过在解决问题的过程中,我发现了hiveserver2的连接,试了一下,问题解决了。


连接方法2:hiveserver2

1.开启hiveserver2:hive --service hiveserver2



2.源代码,注意驱动要改,url也要改:

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

import org.apache.log4j.Logger;

public class HiveJdbcClient {

	//private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";
	private static String driverName = "org.apache.hive.jdbc.HiveDriver";
	private static String url = "jdbc:hive2://192.168.69.69:10000/qsjs2016";
	private static String user = "test";
	private static String password = "123";
	private static String sql;
	private static ResultSet res;
	private static final Logger log = Logger.getLogger(HiveJdbcClient.class);

	public static void main(String[] args) {
		try {
			Class.forName(driverName);
			Connection conn = DriverManager.getConnection(url, user, password);
			// 默认使用端口10000, <span style="font-family: Arial, Helvetica, sans-serif;">使用数据库qsjs2016,用户名为test,密码为123</span>
			// Connection conn = DriverManager.getConnection(
			// "jdbc:hive://192.168.69.69:10000/qsjs2016", "test",
			// "123");
			Statement stmt = conn.createStatement();

			sql = "show tables";//显示全部表
			System.out.println("Running:" + sql);
			res = stmt.executeQuery(sql);
			System.out.println("执行结果:");
			while (res.next()) {
				System.out.println(res.getString(1));
			}

			conn.close();
			conn = null;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			log.error(driverName + " not found!", e);
			System.exit(1);
		} catch (SQLException e) {
			e.printStackTrace();
			log.error("Connection error!", e);
			System.exit(1);
		}

	}
}

3.执行结果:


至于为什么用hiveserver不能使用指定的数据库的原因我还不清楚,如果有懂的大神麻烦解答一下。

我觉得应该是hive版本的问题,因为hive的bin目录下有hiveserver2但是没有hiveserver


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值