Hive: 用 Java 代码通过 JDBC 连接 Hiveserver 我们可以通过 CLI Client Web UI 等 Hive 提供的用户接口来和 Hive 通信, 但这三种方式最常用的是 CLI;Client 是 Hive 的客户端, 用户连接至 Hive Server 在启动 Client 模式的时候, 需要指出 Hive Server 所在节点, 并且在该节点启动 Hive Server WUI 是通过浏览器访问 Hive 今天我们来谈谈怎么通过 HiveServer 来操作 Hive Hive 提供了 jdbc 驱动, 使得我们可以用 Java 代码来连接 Hive 并进行一些类关系型数据库的 sql 语句查询等操作 同关系型数据库一样, 我们也需要将 Hive 的服务打开 ; 在 Hive 0.11.0 版本之前, 只有 HiveServer 服务可用, 你得在程序操作 Hive 之前, 必须在 Hive 安装的服务器上打开 HiveServer 服务, 如下 : [wyp@localhost /home/q/hive-0.11.0]$ bin/hive --service hiveserver -p 10002 Starting Hive Thrift Server 上面代表你已经成功的在端口为 10002( 默认的端口是 10000) 启动了 hiveserver 服务 这时候, 你就可以通过 Java 代码来连接 hiveserver, 代码如下 : package com.wyp; /** * User: 过往记忆 * Blog: https://www.iteblog.com/ * Date: 13-11-27 * Time: 下午 5:52 */ import java.sql.sqlexception; import java.sql.connection; import java.sql.resultset; import java.sql.statement; import java.sql.drivermanager; public class HiveJdbcTest { private static String drivername = "org.apache.hadoop.hive.jdbc.hivedriver"; public static void main(string[] args) throws SQLException { try { Class.forName(driverName); catch (ClassNotFoundException e) { 1 / 5
e.printstacktrace(); System.exit(1); Connection con = DriverManager.getConnection("jdbc:hive://localhost:10002/default", "w yp", ""); Statement stmt = con.createstatement(); String tablename = "wyphao"; stmt.execute("drop table if exists " + tablename); stmt.execute("create table " + tablename + " (key int, value string)"); System.out.println("Create table success!"); // show tables String sql = "show tables '" + tablename + "'"; ResultSet if (res.next()) { System.out.println(res.getString(1)); // describe table sql = "describe " + tablename; System.out.println(res.getString(1) + "\t" + res.getstring(2)); sql = "select * from " + tablename; System.out.println(String.valueOf(res.getInt(1)) + "\t" + res.getstring(2)); sql = "select count(1) from " + tablename; System.out.println(res.getString(1)); 2 / 5
编译上面的代码, 之后就可以运行 ( 我是在集成开发环境下面运行这个程序的 ), 结果如下 : Create table success! Running: show tables 'wyphao' wyphao Running: describe wyphao key int value string Running: select count(1) from wyphao 0 Process finished with exit code 0 如果你想在脚本里面运行, 请将上面的程序打包成 jar 文件, 并将上面的依赖库放在 /home/wyp/li b/( 这个根据你自己的情况弄 ) 中, 同时加入到运行的环境变量, 脚本如下 : #!/bin/bash HADOOP_HOME=/home/q/hadoop-2.2.0 HIVE_HOME=/home/q/hive-0.11.0-bin CLASSPATH=$CLASSPATH: for i in /home/wyp/lib/*.jar ; do CLASSPATH=$CLASSPATH:$i done echo $CLASSPATH /home/q/java/jdk1.6.0_20/bin/java -cp $CLASSPATH:/export1/tmp/iteblog/OutputText.jar co m.wyp.hivejdbctest 上面是用 Java 连接 HiveServer, 而 HiveServer 本身存在很多问题 ( 比如 : 安全性 并发性等 ); 针对这些问题,Hive0.11.0 版本提供了一个全新的服务 :HiveServer2, 这个很好的解决 HiveServer 存在的安全性 并发性等问题 这个服务启动程序在 ${HIVE_HOME/bin/hiveserver2 里面, 你可以通过下面的方式来启动 HiveServer2 服务 : $HIVE_HOME/bin/hiveserver2 3 / 5
也可以通过下面的方式启动 HiveServer2 $HIVE_HOME/bin/hive --service hiveserver2 两种方式效果都一样的 但是以前的程序需要修改两个地方, 如下所示 : private static String drivername = "org.apache.hadoop.hive.jdbc.hivedriver"; 改为 private static String drivername = "org.apache.hive.jdbc.hivedriver"; Connection con = DriverManager.getConnection("jdbc:hive://localhost:10002/default", "wyp", " "); 改为 Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10002/default", "wyp", ""); 其他的不变就可以了 这里顺便说说本程序所依赖的 jar 包, 一共有以下几个 : hadoop-2.2.0/share/hadoop/common/hadoop-common-2.2.0.jar $HIVE_HOME/lib/hive-exec-0.11.0.jar $HIVE_HOME/lib/hive-jdbc-0.11.0.jar $HIVE_HOME/lib/hive-metastore-0.11.0.jar $HIVE_HOME/lib/hive-service-0.11.0.jar $HIVE_HOME/lib/libfb303-0.9.0.jar $HIVE_HOME/lib/commons-logging-1.0.4.jar $HIVE_HOME/lib/slf4j-api-1.6.1.jar 如果你是用 Maven, 加入以下依赖 <dependency> <groupid>org.apache.hive</groupid> <artifactid>hive-jdbc</artifactid> <version>0.11.0</version> 4 / 5
Powered by TCPDF (www.tcpdf.org) Hive: 用 Java 代码通过 JDBC 连接 Hiveserver </dependency> <dependency> <groupid>org.apache.hadoop</groupid> <artifactid>hadoop-common</artifactid> <version>2.2.0</version> </dependency> 本博客文章除特别声明, 全部都是原创! 转载本文请加上 : 转载自过往记忆 (https://www.iteblog.com/) 本文链接 : () 5 / 5