HiveServer和HiveServer2都有两种模式,分别为嵌入式和单机服务器模式,对于嵌入式URI为"jdbc:hive://"或者"jdbc:hive2://",单机服务器模式的URI为"jdbc:hive://host:port/dbname"或者"jdbc:hive2://host:port/dbname"。HiveServer使用的JDBC驱动类为org.apache.hadoop.hive.jdbc.HiveDriver,而HiveServer2使用的驱动类为org.apache.hive.jdbc.HiveDriver。
HiveServer2的JDBC客户端与连接传统数据库如Oracle、MySQL的客户端极度相似,除了连接URL略有区别以外,HiveServer2的连接URL前缀统一为jdbc:hive2://。由于HiveServer2支持通过HTTP传输数据,也支持SSL连接,所以存在三种连接URL,下面分别进行学习。
首先是基于TCP的连接URL,对于远程服务器URL格式为:jdbc:hive2://<host>:<port>/<db>,默认端口为10000。嵌入式URL格式为:jdbc:hive2://,没有主机和端口号。
当hive.server2.transport.mode的值为HTTP,即基于HTTP传输数据时,连接URL为:jdbc:hive2://<host>:<port>/<db>?hive.server2.transport.mode=http;hive.server2.thrift.http.path=<http_endpoint>。其中http_endpoint的值为hive.server2.thrift.http.path设置的值,默认为cliservice,默认端口号为10001。
当HiveServer2启用SSL时,即hive.server2.use.SSL的值为true,连接URL为:jdbc:hive2://<host>:<port>/<db>;ssl=true;sslTrustStore=<trust_store_path>;trustStorePassword=<trust_store_password>。其中<trust_store_path>的值为hive.server2.keystore.path设置的保存keystore的路径,<trust_store_password>为hive.server2.keystore.password设置的keystore密码。在HTTP模式下,连接URL为:jdbc:hive2://<host>:<port>/<db>;ssl=true;sslTrustStore=<trust_store_path>;trustStorePassword=<trust_store_password>?hive.server2.transport.mode=http;hive.server2.thrift.http.path=<http_endpoint>,各参数的含义同上。
使用JDBC驱动程序操作Hive中的数据大体可以分成四个步骤,分别为:
下面看看Hive与JDBC数据类型的对应关系,如下表所示。
Hive类型 |
Java 类型 |
描述 |
TINYINT |
byte |
有符号或无符号1字节整数 |
SMALLINT |
short |
有符号2字节整数 |
INT |
int |
有符号4字节整数 |
BIGINT |
long |
有符号8字节整数 |
FLOAT |
double |
单精度浮点数 |
DOUBLE |
double |
双精度浮点数 |
DECIMAL |
java.math.BigDecimal |
固定精度小数值 |
BOOLEAN |
boolean |
布尔值,0或1 |
STRING |
String |
字符串 |
TIMESTAMP |
java.sql.Timestamp |
日期时间 |
BINARY |
String |
二进制数据 |
ARRAY |
String – json encoded |
同种数据类型的值 |
MAP |
String – json encoded |
key-value对 |
STRUCT |
String – json encoded |
结构化值 |
下面通过一个简单的例子看看HiveServer2 JDBC客户端代码是如何编写的。
import java.sql.Connection; importjava.sql.DriverManager; import java.sql.ResultSet; importjava.sql.PreparedStatement; import java.sql.SQLException; public class HiveServer2Client { publicstatic voidmain(String[] args) throws ClassNotFoundException{ Class.forName("org.apache.hive.jdbc.HiveDriver"); try{ Connection con = DriverManager.getConnection("jdbc:hive2://hadoop:10000/logdb","hadoop",""); PreparedStatement sta = con.prepareStatement("select cast(date as date) from ccp group bycast(date as date)"); ResultSet result = sta.executeQuery(); while(result.next()){ System.out.println(result.getDate(1)); } } catch(SQLException e) { e.printStackTrace(); } } }
编译运行上面的代码需要确保类路径中包含下面所列的jar包,否则会失败:
hive-jdbc-0.13.0.jar、hive-service-0.13.0.jar 、httpcore-4.2.5.jar、httpclient-4.2.5.jar、commons-logging-1.1.3.jar、hive-exec-0.13.0.jar、hadoop-core-1.2.1.jar、slf4j-log4j12-1.4.3.jar、slf4j-api-1.4.3.jar、log4j-1.2.16.jar、libthrift-0.9.0.jar
在实际执行上面的代码时,连接URL中的user参数不可以随意指定,指定的用户必须在HDFS上有操作文件的权限,否则会出现下面所示的异常:
org.apache.hadoop.security.AccessControlException: Permission denied: user=hive, access=WRITE,inode="hive-hadoop":hadoop:supergroup:rwxr-xr-x