2018-09-05期 Hive客户端操作(JDBC和Thrift方式)

说明:

使用的都是CLI或者hive –e的方式仅允许使用HiveQL执行查询、更新等操作。然而Hive也提供客户端的实现,通过HiveServer或者HiveServer2,客户端可以在不启动CLI的情况下对Hive中的数据进行操作,两者都允许远程客户端使用多种编程语言如Java、Python向Hive提交请求,取回结果。

HiveServer与HiveServer2的异同?

HiveServer和HiveServer2都是基于Thrift。既然已经存在HiveServer为什么还需要HiveServer2呢?因为HiveServer不能处理多于一个客户端的并发请求,这是由于HiveServer使用的Thrift接口所导致的限制,不能通过修改HiveServer的代码修正。因此在Hive-0.11.0版本中重写了HiveServer代码得到了HiveServer2,进而解决了该问题。HiveServer2支持多客户端的并发和认证,为开放API客户端如JDBC、ODBC提供了更好的支持。

启动hiverServer服务

要启动HiveServer服务器,只需要在hive-site.xml中配置相关参数即可

<property>

 <!-- HiveServer2远程连接的端口,默认为10000 -->

 <name>hive.server2.thrift.port</name>

 <value>10000</value>

</property>

<property>

 <!-- hive所在集群的IP地址 -->

 <name>hive.server2.thrift.bind.host</name>

 <value>192.168.1.201</value>

</property>

<property>

 <!-- 默认为5000L,此处修改为5000,不然程序会报错 -->

 <name>hive.server2.long.polling.timeout</name>

 <value>5000</value>

</property>

启动元数据库

先启动元数据库,在命令行中键入:

[root@hadoop-server01 ~]# hive --service metastore &

启动服务

#hive --service hiveserver >/dev/null &

以上命令启动hiveserver2服务。

Hive提供了jdbc驱动,使得我们可以用java代码来连接Hive并进行一些类关系型数据库的sql语句查询等操作。首先,我们必须将Hive的服务,也就是HiveServe打开。如果启动hiveserver就把上面命令改为

#hive --service hiveserver >/dev/null &  

一、新建Java工程,并导入需要的依赖包

1、新建Java工程

这里省略掉

2、添加Hive依赖包

新建hivelib用户库,添加Hive Jar包,将hive lib目录下的所有jar包添加到hivelib

clipboard.png

同时还需要添加E:\depslib\hadoop-2.4.1\share\hadoop\common\下的hadoop-common-2.4.1.jar

和E:\depslib\hadoop-2.4.1\share\hadoop\common\lib\slf4j-api-1.7.5.jar

二、基于JDBC方式操作Hive

package cn.songjq.bigdata.hive.jdbc;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

/**

* 通过JDBC驱动方式操作Hive

* @author songjq

*

*/

public class HiveJdbc {

/*

* 获取数据库连接

*/

public static Connection getConn() {

//定义连接hive的url

String url = "jdbc:hive://192.168.1.201:10000/default";

//定义驱动名称

String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

//定义数据库连接对象Connection

Connection con = null;

try {

Class.forName(driverName);

} catch (ClassNotFoundException e1) {

e1.printStackTrace();

}

try {

return DriverManager.getConnection(url);

} catch (SQLException e) {

e.printStackTrace();

}

return con;

}

/*

* 释放连接资源

*/

public static void releaseRes(ResultSet rs,Statement pst,Connection con) {

try {

if(null!=rs) {

rs.close();

}

if(null!=pst) {

pst.close();

}

if(null!=con) {

con.close();

}

}catch (Exception e) {

e.printStackTrace();

}finally {

rs = null;

pst = null;

con = null;

}

}

/**

* 查询emp表 30号部门员工信息

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

//获取连接

Connection conn = HiveJdbc.getConn();

//获取运行资源环境

Statement pst = conn.createStatement();

//执行查询

ResultSet rs = pst.executeQuery("select * from emp where deptno=30");

//遍历结果集

while(rs.next()) {

int empno = rs.getInt(1);

String ename = rs.getString(2);

String job = rs.getString(3);

int mgr = rs.getInt(4);

String hiredate = rs.getString(5);

float sal = rs.getFloat(6);

float comm = rs.getFloat(7);

int deptno = rs.getInt(8);

System.out.println(empno+"\t"+ename+"\t"+deptno+"\t"+job+"\t"+mgr+"\t"+hiredate+"\t"+sal+"\t"+comm);

}

HiveJdbc.releaseRes(rs, pst, conn);

}

}

运行结果:

7654 MARTIN 30 SALESMAN 7698 1981/9/28 1250.0 1400.0

7698 BLAKE 30 MANAGER 7839 1981/5/1 2850.0 0.0

7844 TURNER 30 SALESMAN 7698 1981/9/8 1500.0 0.0

7900 JAMES 30 CLERK 7698 1981/12/3 950.0 0.0

8124 Tom 30 SALESMAN 7698 1981/2/20 1600.0 300.0

8125 Lucy 30 SALESMAN 7698 1981/2/22 1250.0 500.0

8127 Jim 30 SALESMAN 7698 1981/9/28 1250.0 1400.0

8128 John 30 MANAGER 7839 1981/5/1 4521.0 0.0

8132 Michal 30 SALESMAN 7698 1981/9/8 1500.0 0.0

8134 Gaze 30 CLERK 7698 1981/12/3 1234.0 0.0、

三、基本Thrift方式操作Hive

package cn.songjq.bigdata.hive.thrift;

import java.util.List;

import org.apache.hadoop.hive.service.HiveClient;

import org.apache.hadoop.hive.service.HiveServerException;

import org.apache.thrift.TException;

import org.apache.thrift.protocol.TBinaryProtocol;

import org.apache.thrift.protocol.TProtocol;

import org.apache.thrift.transport.TSocket;

import org.apache.thrift.transport.TTransport;

/**

* 通过thrift操作hive

* @author songjq

*

*/

public class HiveThrift {

public static void main(String[] args) throws Exception {

//指定Hive服务器地址及端口

TTransport trans = new TSocket("192.168.1.201", 10000);

trans.open();

//创建通信协议

TProtocol prot = new TBinaryProtocol(trans);

//创建HiveClient

HiveClient client = new HiveClient(prot);

//执行查询emp表30号部门的员工信息

client.execute("select empno,ename,deptno,job,salary from emp where deptno=30");

//取出结果

List<String> allList = client.fetchAll();

for(String s:allList) {

System.out.println(s);

}

//关闭客户端

client.shutdown();

}

}

执行结果:

7499 ALLEN 30 SALESMAN 1600.0

7521 WARD 30 SALESMAN 1250.0

7654 MARTIN 30 SALESMAN 1250.0

7698 BLAKE 30 MANAGER 2850.0

7844 TURNER 30 SALESMAN 1500.0

7900 JAMES 30 CLERK 950.0

8124 Tom 30 SALESMAN 1600.0

8125 Lucy 30 SALESMAN 1250.0

8127 Jim 30 SALESMAN 1250.0

8128 John 30 MANAGER 4521.0

8132 Michal 30 SALESMAN 1500.0

8134 Gaze 30 CLERK 1234.0


猜你喜欢

转载自blog.51cto.com/2951890/2170588