通过JDBC连接Hive Server2

2 篇文章 0 订阅

通过JDBC连接Hive Server2,首先要准备好JDBC连接所需要的JAR包。

C:\Program Files\DbVisualizer\jdbc\hive\commons-logging-1.1.3.jar
C:\Program Files\DbVisualizer\jdbc\hive\hadoop-common-2.3.0-cdh5.1.3.jar
C:\Program Files\DbVisualizer\jdbc\hive\hive-common-0.12.0-cdh5.1.3.jar
C:\Program Files\DbVisualizer\jdbc\hive\hive-exec-0.12.0-cdh5.1.3.jar
C:\Program Files\DbVisualizer\jdbc\hive\hive-jdbc-0.12.0-cdh5.1.3.jar
C:\Program Files\DbVisualizer\jdbc\hive\hive-metastore-0.12.0-cdh5.1.3.jar
C:\Program Files\DbVisualizer\jdbc\hive\hive-service-0.12.0-cdh5.1.3.jar
C:\Program Files\DbVisualizer\jdbc\hive\libfb303-0.9.0.jar
C:\Program Files\DbVisualizer\jdbc\hive\log4j-1.2.16.jar
C:\Program Files\DbVisualizer\jdbc\hive\slf4j-api-1.7.5.jar
C:\Program Files\DbVisualizer\jdbc\hive\slf4j-log4j12-1.7.5.jar
C:\Program Files\DbVisualizer\jdbc\hive\httpclient-4.2.5.jar
C:\Program Files\DbVisualizer\jdbc\hive\httpcore-4.2.5.jar

如果没添加最后两个,可能会出现下面的报错

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/HttpRequestInterceptor
     at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105)
     at java.sql.DriverManager.getConnection(DriverManager.java:571)
     at java.sql.DriverManager.getConnection(DriverManager.java:215)
     at com.simon.HiveJDBCTest.main(HiveJDBCTest.java:33)
Caused by: java.lang.ClassNotFoundException: org.apache.http.HttpRequestInterceptor
     at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
     at java.security.AccessController.doPrivileged(Native Method)
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
     ... 4 more

第一步:JDBC连接需要设置好驱动程序,连接url等信息。

private static String driverName = "org.apache.hive.jdbc.HiveDriver";

连接URL

private static String url = "jdbc:hive2://<SERVER_IP>:<THRIFTSEVER2_PORT>/<DATABASE_NAME>";

如果需要设置队列
private static String url = "jdbc:hive2://<SERVER_IP>:<THRIFTSEVER2_PORT>/<DATABASE_NAME>?mapred.job.queue.name=<QUEUE_NAME>";

使用聚集函数
private static String url = "jdbc:hive2://<SERVER_IP>:<THRIFTSEVER2_PORT>/<DATABASE_NAME>?mapred.job.queue.name=<QUEUE_NAME>;hive.mapred.mode=nonstrict";

在Apache官方的wiki上,有关于连接URL的详细帮助

The HiveServer2 URL is a string with the following syntax:

jdbc:hive2://<host1>:<port1>,<host2>:<port2>/dbName;initFile=<file>;sess_var_list?hive_conf_list#hive_var_list

where

<host1>: <port1>,<host2>:<port2> is a server instance or a comma separated list of server instances to connect to (if dynamic service discovery is enabled). If empty, the embedded server will be used.

dbName is the name of the initial database.

<file> is the path of init script file (Hive 2.2.0 and later). This script file is written with SQL statements which will be executed automatically after connection. This option can be empty.

hive_conf_list is a semicolon separated list of key=value pairs of Hive configuration variables for this session

hive_var_list is a semicolon separated list of key=value pairs of Hive variables for this session.

说明一下

  • 关于多台服务器实例的情况,可以用逗号把服务器分开,前提是
    在$HIVE_HOME/conf/hive-site.xml里面配置dynamic.service.discovery
<property>
     <name>hive.server2.support.dynamic.service.discovery</name>
     <value>true</value>
</property>
  • 关于initFile,可以把脚本写到命令里,默认执行这里面的脚本,这个属于Hive2.2.0版本之后的功能

  • 关于hive_conf_list
    当URL里面没有hive_conf_list ,也就是格式如下

private static String url = "jdbc:hive2://<SERVER_IP>:<THRIFTSEVER2_PORT>/<DATABASE_NAME>?mapred.job.queue.name=<QUEUE_NAME>;hive.mapred.mode=nonstrict";

代码如下:

 conn = DriverManager.getConnection(url, user,password );
  • 关于hive_var_list

而当URL里面包含了sess_var_list,如下:

private static String url = "jdbc:hive2://<SERVER_IP>:<THRIFTSEVER2_PORT>/<DATABASE_NAME>;username=username;password=password?mapred.job.queue.name=<QUEUE_NAME>;hive.mapred.mode=nonstrict";

连接代码是

conn = DriverManager.getConnection(url);

第二步:通过反射机制获取驱动程序

try {
      Class.forName(driverName);
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      System.exit(1);
    }

第三步:建立连接

conn = DriverManager.getConnection(url, user,password);

或者是

conn = DriverManager.getConnection(url);

第四步:创建statement

stmt = conn.createStatement();

第五步:准备SQL脚本

例如,查看所有的表:
sql = "show tables";

或者,统计test表有多少记录
sql = "select count(1) from test";

第六步:statement执行脚本

res = stmt.executeQuery(sql);

第七步,处理结果集

while(res.next()) {
     System.out.println(res.getString(1));
}

第八步,关闭statement

if (stmt != null) {
     stmt.close();
     stmt = null;
}

第九步,关闭连接

if (conn != null) {
     conn.close();
     conn = null;
}

注意,关闭statement和connection都要捕捉异常。整个过程可以使用try/catch/finally完成,将关闭异常处理放在finally里面。

详细资料,请使用
参考文档
https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值