您的位置:首页 > 编程语言 > Java开发

Eclipse JDBC连接Hive 两种方法 hiveserver hiveserver2

2016-03-31 17:20 701 查看
环境: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息