环境: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