HiveServer和HiveServer2都有两种模式,分别为嵌入式和单机服务器模式,对于嵌入式URI为"jdbc:hive://"或者"jdbc:hive2://",单机服务器模式的URI为
。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数据类型的对应关系,如下表所示。
下面通过一个简单的例子看看HiveServer2 JDBC客户端代码是如何编写的。
编译运行上面的代码需要确保类路径中包含下面所列的jar包,否则会失败:
在实际执行上面的代码时,连接URL中的user参数不可以随意指定,指定的用户必须在HDFS上有操作文件的权限,否则会出现下面所示的异常: