1. 程式人生 > >其它語言通過HiveServer2訪問Hive

其它語言通過HiveServer2訪問Hive

先解釋一下幾個名詞: - metadata :hive元資料,即hive定義的表名,欄位名,型別,分割槽,使用者這些資料。一般儲存關係型書庫mysql中,在測試階段也可以用hive內建Derby資料庫。 - metastore :hivestore服務端。主要提供將DDL,DML等語句轉換為MapReduce,提交到hdfs中。 - hiveserver2:hive服務端。提供hive服務。客戶端可以通過beeline,jdbc(即用java程式碼連結)等多種方式連結到hive。 - beeline:hive客戶端連結到hive的一個工具。可以理解成mysql的客戶端。如:navite cat 等。 其它語言訪問`hive`主要是通過hiveserver2服務,HiveServer2(HS2)是一種能使客戶端執行Hive查詢的服務。HiveServer2可以支援對 HiveServer2 的嵌入式和遠端訪問,支援多客戶端併發和身份認證。旨在為開放API客戶端(如JDBC和ODBC)提供更好的支援。 會啟動一個hive服務端預設埠為:10000,可以通過beeline,jdbc,odbc的方式連結到hive。hiveserver2啟動的時候會先檢查有沒有配置hive.metastore.uris,如果沒有會先啟動一個metastore服務,然後在啟動hiveserver2。如果有配置hive.metastore.uris。會連線到遠端的metastore服務。這種方式是最常用的。部署在圖如下: ![](https://img2020.cnblogs.com/blog/1165270/202012/1165270-20201218171248981-1848352016.png) # Python連線Hive `Python3`訪問hive需要安裝的依賴有: - pip3 install thrift - pip3 install PyHive - pip3 install sasl - pip3 install thrift_sasl 這裡有一個`Python`訪問`Hive`的工具類: ```sql # -*- coding:utf-8 -*- from pyhive import hive class HiveClient(object): """docstring for HiveClient""" def __init__(self, host='hadoop-master',port=10000,username='hadoop',password='hadoop',database='hadoop',auth='LDAP'): """ create connection to hive server2 """ self.conn = hive.Connection(host=host, port=port, username=username, password=password, database=database, auth=auth) def query(self, sql): """ query """ with self.conn.cursor() as cursor: cursor.execute(sql) return cursor.fetchall() def insert(self, sql): """ insert action """ with self.conn.cursor() as cursor: cursor.execute(sql) # self.conn.commit() # self.conn.rollback() def close(self): """ close connection """ self.conn.close() ``` 使用的時候,只需要匯入,然後建立一個物件例項即可,傳入`sql`呼叫`query`方法完成查詢。 ```python # 拿一個連線 hclient = hive.HiveClient() # 執行查詢操作 ... # 關閉連線 hclient.close() ``` **注意**:在`insert`插入方法中,我將`self.conn.commit()`和`self.conn.rollback()`即回滾註釋了,這是傳統關係型資料庫才有的事務操作,`Hive`中是不支援的。 # Java連線Hive `Java`作為大資料的基礎語言,連線hive自然是支援的很好的,這裡介紹通過jdbc和mybatis兩種方法連線hive。 ## 1. Jdbc連線 java通過jdbc連線hiveserver,跟傳統的jdbc連線mysql方法一樣。 需要hive-jdbc依賴: ```xml ``` 程式碼跟連線`mysql`套路一樣,都是使用的`DriverManager.getConnection(url, username, password)`: ```java @NoArgsConstructor @AllArgsConstructor @Data @ToString public class HiveConfigModel { private String url = "jdbc:hive2://localhost:10000"; private String username = "hadoop"; private String password = "hadoop"; } @Test public void test(){ // 初始化配置 HiveConfigModel hiveConfigModel = ConfigureContext.getInstance("hive-config.properties") .addClass(HiveConfigModel.class) .getModelProperties(HiveConfigModel.class); try { Connection conn = DriverManager.getConnection(hiveConfigModel.getUrl(), hiveConfigModel.getUsername(), hiveConfigModel.getPassword()); String sql = "show tables"; PreparedStatement preparedStatement = conn.prepareStatement(sql); ResultSet rs = preparedStatement.executeQuery();