本帖最后由 rsgg03 于 2015-3-30 20:51 编辑
问题导读
1.HiveServer和HiveServer2都有哪两种模式?
2.HiveServer与HiveServer2驱动类有什么不同?
3.HiveServer2存在哪三种连接URL?
4.hive与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中的数据大体可以分成四个步骤,分别为:
- 加载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客户端代码是如何编写的。 - 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
复制代码
|