Java通過HiveServer2訪問Hive服務示例
Hive具有一個可選的元件叫做HiveServer或者HiveThrift,其允許通過指定埠訪問Hive。Thrift是一個高效的RPC服務框架,可以通過程式設計的方式遠端訪問Hive。
hive對外提供thrift和jdbc兩種介面方式。其中jdbc是基於thrift介面封裝,jdbc支援每個方法都是同步操作,但是hiveserver2 thrift介面支援非同步操作,jdbc同步只是因為在現實上加了同步鎖。
hiveserver1和hiveserver2的主要區別如下:
version | jdbc driver class | jdbc connection url | 是否支援跨語言 | 是否支援併發寫 | 是否支援表鎖 | 預設thrift埠 |
hiveserver1 | org.apache.hive.jdbc.HiveDriver | jdbc:hive://: | 是 | 否 | 否 | 10000 |
hiveserver2 | org.apache.hadoop.hive.jdbc.HiveDriver | jdbc:hive2://: | 是 | 是 | 是(基於zk的表鎖) | 10000 |
下面就簡單的實現一個Java通過HiveServer2訪問Hive資料的示例:
pom.xml新增依賴:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.41</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.2</version> </dependency>
定義介面,HiveDao.java:
import com.alibaba.fastjson.JSONObject;
public interface HiveDao {
/**
* 一般查詢
*
* @param connection
* @param sql
* @return
*/
JSONObject querySql(HadoopConnection connection, String sql);
}
HadoopConnection.java:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class HadoopConnection { private int id; private String url; private long keepTime; /** * 連線狀態 0:空閒;1:使用 */ private int status; private String username; private String pawssord; private Connection connection; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public long getKeepTime() { return keepTime; } public void setKeepTime(long keepTime) { this.keepTime = keepTime; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPawssord() { return pawssord; } public void setPawssord(String pawssord) { this.pawssord = pawssord; } public Connection getConnection() { return connection; } public void setConnection(Connection connection) { this.connection = connection; } public HadoopConnection(int id, String url, int status, String user, String pwd) throws SQLException { super(); this.id = id; this.url = url; this.status = status; this.username = user; this.pawssord = pwd; this.connection = DriverManager.getConnection(url, username, pawssord); } @Override public String toString() { return "HadoopConnection [id=" + id + ", status=" + status + "]"; } }
HiveDaoImpl.Java:
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Component;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.List;
@Component
public class HiveDaoImpl implements HiveDao {
public static String HIVE_URL = "jdbc:hive2://ip:port/database?mapreduce.job.queuename=xxx;mapred.input.dir.recursive=true;hive.mapred.supports.subdirectories=true;hive.support.quoted.identifiers=none;mapreduce.job.reduces=1";
private static String DRIVER_NAME = "org.apache.hive.jdbc.HiveDriver";
public static String USERNAME = "usename";
public static String PWD = "password";
private static List<HadoopConnection> connections = Lists.newArrayList();
/**
* 初始化連線
*/
public static void init(Integer numpool) {
try {
Class.forName(DRIVER_NAME);//獲得字串引數中指定的類並初始化該類,Class.forName常見的用法就是在載入資料庫驅動的時候。
createConnectionPool(numpool, HIVE_URL, USERNAME, PWD);
} catch (Exception e) {
System.out.println("hadoop connection pool 初始化失敗 : " + e);
}
}
/**
* 無返回值sql
* @param sql
* @throws SQLException
*/
public void excuteSql(HadoopConnection connection, String sql) throws SQLException {
if (connection == null || sql == null) {
return;
}
connection.getConnection().createStatement().execute(sql);
resetConnection(connection);
}
/**
* 一般查詢
* @param connection
* @param sql
* @return
*/
public JSONObject querySql(HadoopConnection connection, String sql) {
JSONObject result = new JSONObject();
if (connection == null || sql == null) {
return result;
}
result.put("request", sql);
try {
//執行sql語句並獲取結果
ResultSet resultSet = connection.getConnection().createStatement().executeQuery(sql);
//獲取返回值的元資料資訊
ResultSetMetaData metaData = resultSet.getMetaData();
//獲取列數
int columnCount = metaData.getColumnCount();
JSONArray heads = new JSONArray();
JSONArray types = new JSONArray();
for (int index = 1; index <= columnCount; index++) {
heads.add(metaData.getColumnName(index));
types.add(metaData.getColumnTypeName(index));
}
JSONArray rowDatas = new JSONArray();
while (resultSet.next()) {
JSONArray rowData = new JSONArray();
for (int index = 1; index <= columnCount; index++) {
rowData.add(resultSet.getString(index));
}
rowDatas.add(rowData);
}
result.put("heads", heads);
result.put("types", types);
result.put("result", rowDatas);
} catch (Exception e) {
result.put("error", e);
}
resetConnection(connection);
return result;
}
/**
* 保持連線存活
*/
public static void keepAliveCollection() {
HadoopConnection keepTemp = null;
try {
for (HadoopConnection connection : connections) {
keepTemp = connection;
if (connection.getStatus() == 0) {
if (connection.getConnection().isClosed()) {
resetConnection(connection);
}
long nowTime = System.currentTimeMillis();
if (nowTime - connection.getKeepTime() > 10000) {
connection.getConnection().createStatement().execute("select 0");
connection.setKeepTime(nowTime);
}
}
}
} catch (Exception e) {
resetConnection(keepTemp);
}
}
/**
* 獲取可用連線
* @return
*/
public static synchronized HadoopConnection getConnection() {
HadoopConnection connection = null;
for (HadoopConnection hadoop : connections) {
if (hadoop.getStatus() == 0) {
hadoop.setStatus(1);
connection = hadoop;
break;
}
}
return connection;
}
public static synchronized void closeConnections() {
if (getConnectionSize() == 0) {
return;
}
try {
for (HadoopConnection hadoop : connections) {
if (hadoop.getConnection() != null) {
hadoop.getConnection().close();
}
}
} catch (Exception e) {
System.out.println("close hadoop connection fail, msg: " + e.getMessage());
} finally {
connections.clear();
}
}
public static synchronized void resetConnection(HadoopConnection connection) {
try {
connection.getConnection().clearWarnings();
if (connection.getConnection().isClosed()) {
System.out.println(connection + " , is reseted!");
connection.setConnection(DriverManager.getConnection(connection.getUrl()));
}
connection.setStatus(0);
} catch (Exception e) {
System.out.println("reset connection exception : " + e);
}
}
public static synchronized void createConnectionPool(int num, String url, String user, String pwd) throws SQLException {
if (!connections.isEmpty()) {
return;
}
for (int i = 0; i < num; i++) {
connections.add(new HadoopConnection(i, url, 0, user, pwd));
System.out.println("hadoop connection pool success : url->["+url+"] user->["+user+"]" );
}
}
public static int getConnectionSize() {
return connections.size();
}
}
測試:
BaseTest.java:
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:testContext.xml"})
public class BaseTest {
}
HiveTest.java:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.didichuxing.risk.hive.HadoopConnection;
import com.didichuxing.risk.hive.HiveDao;
import com.didichuxing.risk.hive.HiveDaoImpl;
import org.junit.Test;
import javax.annotation.Resource;
public class HiveTest extends BaseTest{
@Resource
private HiveDao hiveDao;
@Test
public void testHiveClient() {
try {
HiveDaoImpl.init(6);
HadoopConnection connection = HiveDaoImpl.getConnection();
//取hive庫中資料
String sql = "select * from database.table";
if (connection != null) {
JSONObject jsonObject = hiveDao.querySql(connection, sql);
if (null == jsonObject) {
System.out.println("json object is null.");
}
JSONArray rows = (JSONArray) jsonObject.get("result");
JSONArray heads = (JSONArray) jsonObject.get("heads");
JSONArray types = (JSONArray) jsonObject.get("types");
JSONArray row = null, head = null, type = null;
//列印欄位名
for (int i = 0; i < heads.size(); i++) {
System.out.println(heads.get(i));
}
//列印欄位型別
for (int i = 0; i < types.size(); i++) {
System.out.println(types.get(i));
}
if (rows == null || rows.size() == 0) {
System.out.println("row is null.");
return ;
}
for (int i = 0; i < rows.size(); i++) {
row = (JSONArray) rows.get(i);
System.out.println(row);
}
} else {
System.out.println("get hive data : " + "connection is null");
}
} catch (Exception e) {
System.out.println("get hive data exception : " + e.getMessage());
} finally {
HiveDaoImpl.closeConnections();
}
}
}
以上。
Author:憶之獨秀
Email:[email protected]
註明出處:https://blog.csdn.net/lavorange/article/details/80412288相關推薦
Java通過HiveServer2訪問Hive服務示例
Hive具有一個可選的元件叫做HiveServer或者HiveThrift,其允許通過指定埠訪問Hive。Thrift是一個高效的RPC服務框架,可以通過程式設計的方式遠端訪問Hive。 hive對外提供thrift和jdbc兩種介面方式。其中jdbc是
beeline通過HiveServer2訪問Hive的配置和操作
1. 前言 作為資料倉庫的工具,hive提供了兩種ETL執行方式,分別是通過Hive 命令列和beeline客戶端; 命令列方式即通過hive進入命令模式後通過執行不同的HQL命令得到對應的結果;相當於胖客戶端模式,即客戶機中需要安裝JRE環境和Hive程式。 beelin
其它語言通過HiveServer2訪問Hive
先解釋一下幾個名詞: - metadata :hive元資料,即hive定義的表名,欄位名,型別,分割槽,使用者這些資料。一般儲存關係型書庫mysql中,在測試階段也可以用hive內建Derby資料庫。 - metastore :hivestore服務端。主要提供將DDL,DML等語句轉換為MapRedu
Java通過 Socket 實現 TCP服務端(一個實例)
trac write 建立 回復 狀態 else 應用程序 字符 system 1 Java Socket簡介 所謂socket 通常也稱作”套接字“,用於描述IP地址和端口,是一個通信鏈的句柄。應用程序通常通過”套接字”向網絡發出請求或者應答網絡請求。Socket和S
瀏覽器通過http協議通過nginx訪問ftp服務器上的文件
es2017 協議 alt com 默認目錄 blog nginx nbsp 訪問 1、修改nginx配置文件 2、修改nginx默認目錄為ftp默認目錄 3、修改成自定義路徑後,並修改此目錄第一行,修改為root或是nginx用戶 4、重新加載 cd /usr/lo
Java通過thrift呼叫Python服務
重新使用thrift-0.11,發現有點遺忘了,所以稍微整理一下。本文只提幾個關鍵點,其它步驟有很多好的部落格可以參考。 目標:Python作為服務端,Java作為客戶端。 1、安裝thrift 2、新建一個存放Python服務程式碼的資料夾pythonserver,在
如何解決Java通過JDBC訪問MySQL時SSL連線告警問題
背景 MySQL 5.5.45+, 5.6.26+, 5.7.6+開始支援SSL連線,如果沒有明確設定相關的選項時,預設要求SSL連線。為相容性考慮,舊應用程式需要設定verifyServerCert
JAVA通過HTTP訪問:Post+Get方式
public class TestGetPost { /** * 向指定URL傳送GET方法的請求 * @param url 傳送請求的URL * @param param 請求引數,請求引數應該是name1=value1&name2=value2的形
java通過cxf實現webservice服務端,客戶端接收不到響應資訊處理方法
最近在做專案時與客戶進行webservice聯調,響應成功後返回1,服務端正常返回,客戶端表示沒有收到,針對其中的問題分析和處理方法。 1.判斷是否是服務寫的有問題,寫了個測試方式試了下,發現服務端返回沒有問題 String xmlStr = "<?xml vers
Java通過Jolt呼叫Tuxedo服務-補充說明
Java通過Jolt訪問Tuxedo服務-補充說明 草木瓜 2006-6-2 一、頁面引數檔案說明以及通過WebLogic呼叫Tuxedo服務 《Java通過Jolt訪問Tuxedo服務》一文是在Eclipse環境下開發呼叫Tuxedo服務。 其中在index.asp和liw
web專案打包->部署雲伺服器(阿里雲 華為雲)並通過公網訪問web服務的過程記錄
1.通過idea打出war包 過程截圖如下: 2.上面已經配置好了war包 若本地執行 只需配置tomcat即可 若要部署 則點選上面選單欄 bulid->build Artifacts 如圖 選擇要build的war包 打出來的war
通過tomcat訪問服務器下其他路徑下文
localhost 服務器 url 開始 需求 標簽 div 成功 連接方式 項目上有這樣一個需求,需要通過tomcat訪問所在服務器其他路徑下的文件(項目上傳文件時放在tomcat之外的)。最開始想通過在tomcat下建立軟連接方式指向目標文件夾,倒騰了半天沒成功(註意t
阿裏雲VPC服務器通過ClassicLink訪問經典網絡服務器
0.11 配置 1.0 nbsp ecs lin 2個 阿裏 交換機 VPC中的服務器名稱是 vpc-ecs1 , 經典網絡中的服務器名稱是 classic-ecs2 ,要實現 vpc-ecs1 通過內網訪問 classic-ecs2 。 VPC 網段是 10.0.0.0
內網通過域名及公網IP訪問WWW服務器情況匯總
數據 water 外網 blob inside 有用 情況下 use host 一、網絡環境及問題描述網絡環境: 1、內部網絡辦公網劃分VLAN10 網段:192.168.1.0/24 網關位於核心SWA2、DMZ網絡劃分至VLAN20 網段:192.168.2.0/24
通過域名訪問自己部署到服務器上的項目
linux tomcat 用戶 name 直接 http 註意 ali 內容 通過域名訪問自己部署到服務器上的項目 如何不輸入項目名端口號直接訪問java web項目 1、省略輸入端口號的步驟 在Linux的下面部署了tomcat,為了安全我們使用非root用
訪問dubbo沒有權限,通過ip進行跳轉服務器,並通過有權限服務器代理訪問
service _for dnat asq tro -- 編譯 tar conf #啟動ip跳轉 echo 1 > /proc/sys/net/ipv4/ip_forward vi /etc/sysctl.conf net.ipv4.ip_forward =1
ubuntu 搭建ftp服務器,可以通過瀏覽器訪問,filezilla上傳文件等功能
serve ecif 最新 remote vsftp protoc 新的 zone ken 搭建ftp服務器 1:首先,更新軟件源,保證源是最新的,這樣有利於下面在線通過apt-get install命令安裝ftp。 2:使用sudo apt-get install vs
Spring boot 配置https 實現java通過https介面訪問
近來公司需要搭建一個https的伺服器來除錯介面(伺服器用的spring boot框架),剛開始接觸就是一頓百度,最後發現網際網路認可的https安全連結的證書需要去CA認證機構申請,由於是除錯階段就採用了java的keytool工具來生成金鑰檔案
通過設定ie的通過跨域訪問資料來源,來訪問本地服務
1、首先設定通過域訪問資料來源 設定通過域訪問資料來源 2、javascript指令碼ajax使用本地服務登入(評價,人證的類似)介面 <html> <head> <script type="text/javascript"> f
內網中,JAVA通過代理方式,訪問URL
1)前言:企業實際開發中,會遇到這樣的情況,在瀏覽器中可以訪問域名地址(如:www.baidu.com),但是實際在命令列中,通過ping命令是ping不通的。 2)原因: 2.1)首先我們的電腦能連線到外網,在通過域名訪問地址時,正常的訪問流程是,先到最近的域名