Hive学习之HiveServer2 JDBC客户端

     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中的数据大体可以分成四个步骤,分别为:

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

       下面看看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

布尔值,01

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

你可能感兴趣的:(hive,jdbc,server,thrift,thrift,hiveserver2)