Hive学习之HiveServer2 JDBC客户端

来源:互联网 发布:html 中json为定义 编辑:程序博客网 时间:2024/04/29 10:10
HiveServer和HiveServer2都有两种模式,分别为嵌入式和单机服务器模式,对于嵌入式URI为"jdbc:hive://"或者"jdbc:hive2://",单机服务器模式的URI为
  1. "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中的数据大体可以分成四个步骤,分别为:

  • 加载HiveServer2驱动程序,Class.forName("org.apache.hive.jdbc.HiveDriver")。
  • 根据URL连接指定的数据库:Connection cnct =DriverManager.getConnection("jdbc:hive2://<host>:<port>","<user>", "<password>")。在非安全模式下,指定一个<user>运行查询,忽略密码<password>,在Kerberos 安全模式下,用户信息基于Kerberos 凭证。
  • 通过Statement 对象将查询提交到数据库并执行:Statement stmt = cnct.createStatement(); ResultSet rset = stmt.executeQuery("SELECT foo FROMbar");
  • 对返回的结果进行必要的处理。

       下面看看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客户端代码是如何编写的。
  1. import java.sql.Connection;
  2. importjava.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. importjava.sql.PreparedStatement;
  5. import java.sql.SQLException;
  6. public class HiveServer2Client {
  7.       publicstatic voidmain(String[] args) throws ClassNotFoundException{
  8.              Class.forName("org.apache.hive.jdbc.HiveDriver");
  9.              try{
  10.                     Connection con = DriverManager.getConnection("jdbc:hive2://hadoop:10000/logdb","hadoop","");
  11.                     PreparedStatement sta = con.prepareStatement("select cast(date as date) from ccp group bycast(date as date)");
  12.                     ResultSet result = sta.executeQuery();
  13.                     while(result.next()){
  14.                            System.out.println(result.getDate(1));
  15.                     }
  16.              } catch(SQLException e) {
  17.                     e.printStackTrace();
  18.              }
  19.       }
  20. }
复制代码

  编译运行上面的代码需要确保类路径中包含下面所列的jar包,否则会失败:
  1. 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上有操作文件的权限,否则会出现下面所示的异常:
  1. org.apache.hadoop.security.AccessControlException: Permission denied: user=hive, access=WRITE,inode="hive-hadoop":hadoop:supergroup:rwxr-xr-x
复制代码
0 0
原创粉丝点击