通过JDBC连接Hive Server2

来源:互联网 发布:知乎男朋友 编辑:程序博客网 时间:2024/05/17 20:34

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

C:\Program Files\DbVisualizer\jdbc\hive\commons-logging-1.1.3.jarC:\Program Files\DbVisualizer\jdbc\hive\hadoop-common-2.3.0-cdh5.1.3.jarC:\Program Files\DbVisualizer\jdbc\hive\hive-common-0.12.0-cdh5.1.3.jarC:\Program Files\DbVisualizer\jdbc\hive\hive-exec-0.12.0-cdh5.1.3.jarC:\Program Files\DbVisualizer\jdbc\hive\hive-jdbc-0.12.0-cdh5.1.3.jarC:\Program Files\DbVisualizer\jdbc\hive\hive-metastore-0.12.0-cdh5.1.3.jarC:\Program Files\DbVisualizer\jdbc\hive\hive-service-0.12.0-cdh5.1.3.jarC:\Program Files\DbVisualizer\jdbc\hive\libfb303-0.9.0.jarC:\Program Files\DbVisualizer\jdbc\hive\log4j-1.2.16.jarC:\Program Files\DbVisualizer\jdbc\hive\slf4j-api-1.7.5.jarC:\Program Files\DbVisualizer\jdbc\hive\slf4j-log4j12-1.7.5.jarC:\Program Files\DbVisualizer\jdbc\hive\httpclient-4.2.5.jarC:\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