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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章