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

說明: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

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

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

相關文章
相關標籤/搜索