说明:java
使用的都是CLI或者hive –e的方式仅容许使用HiveQL执行查询、更新等操做。然而Hive也提供客户端的实现,经过HiveServer或者HiveServer2,客户端能够在不启动CLI的状况下对Hive中的数据进行操做,二者都容许远程客户端使用多种编程语言如Java、Python向Hive提交请求,取回结果。sql
HiveServer与HiveServer2的异同?数据库
HiveServer和HiveServer2都是基于Thrift。既然已经存在HiveServer为何还须要HiveServer2呢?由于HiveServer不能处理多于一个客户端的并发请求,这是因为HiveServer使用的Thrift接口所致使的限制,不能经过修改HiveServer的代码修正。所以在Hive-0.11.0版本中重写了HiveServer代码获得了HiveServer2,进而解决了该问题。HiveServer2支持多客户端的并发和认证,为开放API客户端如JDBC、ODBC提供了更好的支持。apache
启动hiverServer服务编程
要启动HiveServer服务器,只须要在hive-site.xml中配置相关参数便可api
<property>服务器
<!-- HiveServer2远程链接的端口,默认为10000 -->并发
<name>hive.server2.thrift.port</name>编程语言
<value>10000</value>ide
</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 &
1、新建Java工程,并导入须要的依赖包
一、新建Java工程
这里省略掉
二、添加Hive依赖包
新建hivelib用户库,添加Hive Jar包,将hive lib目录下的全部jar包添加到hivelib
同时还须要添加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
2、基于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、
3、基本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