對接HiveMetaStore,擁抱開源大數據

本文分享自華爲雲社區《對接HiveMetaStore,擁抱開源大數據》,作者:睡覺是大事。

1. 前言

  • 適用版本:9.1.0及以上

在大數據融合分析時代,面對海量的數據以及各種複雜的查詢,性能是我們使用一款數據處理引擎最重要的考量。而GaussDB(DWS)服務有着強大的計算引擎,其計算性能優於MRS服務中的hive或者spark這類計算引擎,且可以以更低的成本滿足業務高彈性和敏捷性需求。通過與MRS聯動,無需搬遷數據,利用DWS的高性能計算引擎處理和分析數據湖中的海量數據以及各種複雜的查詢業務、分析業務越來越成爲主流的解決方案。

我們可以通過創建external schema的方式來對接HiveMetaStore元數據服務,從而實現GaussDB(DWS)直接查詢hive/spark表或者插入數據到hive/spark表。無需創建讀外表或者寫外表,也無需擔心hive/spark表的定義發生變化時GaussDB(DWS)沒有及時更新表定義。

本文章主要描述了GaussDB(DWS)與hivememtastore對接配置與指導。

2. 原理淺析

2.1 什麼是HiveMetaStore

HiveMeatStore是Apache Hive的一個關鍵組件,它是一個元數據存儲庫,用於管理hive/spark表的元數據信息。HiveMeatStore存儲了Hive表的結構信息,包括表名、列名、數據類型、分區信息等。它還存儲了表的位置信息,即表數據存儲何處。HiveMeatStore的主要作用是提供元數據服務,使得Hive/Spark可以對數據進行查詢和分析。它還提供了一些API,可以讓開發人員通過編程方式訪問表的元數據。總之,HiveMeatStore是Hive的一個重要組件,它提供了元數據管理和查詢服務。

external schema即外部模式,GaussDB(DWS)通過創建extrenal schema來對接HiveMeatStore服務,每次查詢主動獲取hive/spark表對象的元數據。無需GaussDB(DWS)內核通過create foreign table獲取hive/spark表的元數據。

2.2 external schema與schema的區別

1 external schema主要用於與HiveMeatStore建立連接,獲取表對象元數據,在創建external schema時需要指定連接的所需要的各個屬性值。

2 普通schema在創建後會將schema的信息記錄在pg_namespace中,external schema創建後和普通schema一樣也會記錄在pg_namespace,可以通過pg_namespace中的nsptype字段區分是external schema還是普通schmea。

圖片說明

除了存儲在pg_namespace中的相關信息外,external schema連接相關的配置信息都會記錄在pg_external_namespace中。

圖片說明

3 external schema下不支持創建表對象。對象的創建是在hive或者spark中創建的,external schema僅用於執行DML操作。

2.3 原理說明

GaussDB(DWS)對接HiveMetaStore流程如下圖所示

1.創建Server,external schema,sql query查詢。

用戶在使用本特性前,將需要創建Server,創建Server過程與已有Server創建過程相同

對於創建OBS server有兩種方式,一種是通過永久AK、SK的方式創建。(此種方式前提是可以獲取永久AK、SK,但是此種方式不安全,AK/SK直接暴露在配置文件中,並且創建服務的時候需要明文輸入AK、SK,不建議採用此種方式創建服務)

另一種雲上DWS綁定ECS委託方式訪問OBS,通過管控面創建OBS server。委託通過管控面創建server可參考創建外表時如何創建OBS server。https://support.huaweicloud.com/mgtg-dws/dws_01_1602.html

創建external schema:

external schema創建語法爲

CREATE External Schema ex 
WITH SOURCE hive
DATABASE 'default'
SERVER hdfs_server
METAADDRESS '10.254.159.121:9010'
CONFIGURATION '/home/fengshuo/conf2';

其中SOURCE字段指定了外部元數據存儲引擎的類型,DATABASE爲Hive中對應的數據庫名,SERVER爲步驟1中創建的server,METAADDRESS爲Hive提供的地址端口信息,CONFIGURATION爲Hive、Kerberos相關配置文件路徑。

external schema的目標是對接外部元數據(Foreign Meta),使得DWS能主動感知外部元數據的變化,如下圖所示。

GaussDB(DWS) 通過external schema 對接HiveMetaStore,映射到對應的外表元數據,再通過外表訪問 Hadoop。

SQL查詢:select查詢形式爲 select * from ex.tbl,其中tbl爲外源表名,ex爲已創建的external schema。

2.語法解析:語法解析層主要針對進行解析,主要負責以下內容:

當讀取到ex.tbl表以後,連接HMS進行元數據查詢

3.元數據查詢:從HMS中查詢元數據信息,該步驟在步驟1中完成。

從HMS中讀取數據,主要包括列信息,分區信息、分區鍵信息、分隔符信息等。

4.數據查詢(針對select):從DFS存儲中獲取統計信息文件個數和文件大小,爲plan生成提供依據。

5.查詢重寫、查詢優化、查詢執行

6.查詢下發:將元數據隨plan下發給DN,DN收到plan以後,會將元數據進行解碼後插入到SysCache中。

7.查詢執行:DN訪問obs對應文件,執行查詢。

3. 與hivememtastore對接流程

3.1 準備環境

已創建 DWS 3.0集羣和MRS分析集羣,需確保MRS和DWS集羣在同一個區域、可用區、同一VPC子網內,確保集羣網絡互通;

已獲取AK和SK。

3.2 在hive端創建需要對接的表

1、在/opt/client路徑下,導入環境變量。
source bigdata_env

2、登錄Hive客戶端。

3、依次執行以下SQL語句創建demo數據庫及目標表表product_info。
CREATE DATABASE demo;
use demo;
DROP TABLE product_info;
 
CREATE TABLE product_info 
(    
    product_price                int            ,
    product_id                   char(30)       ,
    product_time                 date           ,
    product_level                char(10)       ,
    product_name                 varchar(200)   ,
    product_type1                varchar(20)    ,
    product_type2                char(10)       ,
    product_monthly_sales_cnt    int            ,
    product_comment_time         date           ,
    product_comment_num          int        ,
    product_comment_content      varchar(200)                   
) 
row format delimited fields terminated by ',' 
stored as orc;
4、通過insert導入數據到hive表

3.3 創建外部服務器

使用Data Studio連接已創建好的DWS集羣。

MRS端有兩種支持格式,hdfs和obs。hive對接這兩種場景的創建外部服務器的方式也有所不同

執行以下語句,創建OBS外部服務器。

CREATE SERVER obs_servevr FOREIGN DATA WRAPPER DFS_FDW 
OPTIONS 
(
address 'obs.xxx.com:5443',   //OBS的訪問地址。
encrypt 'on',
access_key '{AK值}',
secret_access_key '{SK值}',
 type 'obs'
);
執行以下語句,創建HDFS外部服務器。
CREATE SERVER hdfs_server FOREIGN DATA WRAPPER HDFS_FDW OPTIONS (
      TYPE 'hdfs',
      ADDRESS '{主節點},{備節點}',
      HDFSCFGPATH '{hdfs配置文件地址}');

認證用的AK和SK硬編碼到代碼中或者明文存儲都有很大的安全風險,建議在配置文件或者環境變量中密文存放,使用時解密,確保安全。另外,dws內部會對sk做加密處理,因此不用擔心sk在傳輸過程中泄漏。

查看外部服務器(obs爲例)。
SELECT * FROM pg_foreign_server WHERE srvname='obs_server';

返回結果如下所示,表示已經創建成功:

srvname                      | srvowner | srvfdw | srvtype | srvversion | srvacl |                                                     srvoptions
--------------------------------------------------+----------+--------+---------+------------+--------+---------------------------------------------------------------------------------------------------------------------
 obs_server |    16476 |  14337 |         |            |        | {address=obs.xxx.com:5443,type=obs,encrypt=on,access_key=***,secret_access_key=***}
(1 row)

3.4 創建EXTERNAL SCHEMA

獲取Hive的metastore服務內網IP和端口以及要訪問的Hive端數據庫名稱。

登錄MRS管理控制檯。

選擇“集羣列表 > 現有集羣”,單擊要查看的集羣名稱,進入集羣基本信息頁面。

單擊運維管理處的“前往manager”,並輸入用戶名和密碼登錄FI管理頁面。

依次單擊“集羣”、“Hive”、“配置”、“全部配置”、“MetaStore”、“端口”,記錄參數hive.metastore.port對應的值。

依次單擊“集羣”、“Hive”、“實例”,記錄MetaStore對應主機名稱包含master1的管理IP。

創建EXTERNAL SCHEMA

//Hive對接OBS場景:SERVER名字填寫2創建的外部服務器名稱,DATABASE填寫Hive端創建的數據庫,METAADDRESS填寫1中記錄的hive端metastore服務的地址和端口,CONFIGURATION爲MRS數據源默認的配置路徑,不需更改。
DROP SCHEMA IF EXISTS ex1;
 
CREATE EXTERNAL SCHEMA ex1
    WITH SOURCE hive
         DATABASE 'demo'
         SERVER obs_server
         METAADDRESS '***.***.***.***:***'
         CONFIGURATION '/MRS/gaussdb/mrs_server'
 
//Hive對接HDFS場景:SERVER名字填寫創建MRS數據源連接創建的數據源名稱mrs_server,METAADDRESS填寫1中記錄的hive端metastore服務的地址和端口,CONFIGURATION爲MRS數據源默認的配置路徑,不需更改。
DROP SCHEMA IF EXISTS ex1;
 
CREATE EXTERNAL SCHEMA ex1
    WITH SOURCE hive
         DATABASE 'demo'
         SERVER mrs_server
         METAADDRESS '***.***.***.***:***'
         CONFIGURATION '/MRS/gaussdb/mrs_server'

查看創建的EXTERNAL SCHEMA

SELECT * FROM pg_namespace WHERE nspname='ex1';
SELECT * FROM pg_external_namespace WHERE nspid = (SELECT oid FROM pg_namespace WHERE nspname = 'ex1');
                     nspid                     | srvname | source | address | database | confpath |                                                     ensoptions   | catalog
--------------------------------------------------+----------+--------+---------+------------+--------+---------------------------------------------------------------------------------------------------------------------
                  16393                        |    obs_server |  hive | ***.***.***.***:***        |  demo          | ***       |                         |
(1 row)

3.5 執行數據導入hive表

創建本地數據源表,表結構與hive一致
DROP TABLE IF EXISTS product_info_export;
CREATE TABLE product_info_export
(
    product_price                integer        ,
    product_id                   char(30)       ,
    product_time                 date           ,
    product_level                char(10)       ,
    product_name                 varchar(200)   ,
    product_type1                varchar(20)    ,
    product_type2                char(10)       ,
    product_monthly_sales_cnt    integer        ,
    product_comment_time         date           ,
    product_comment_num          integer        ,
    product_comment_content      varchar(200)                   
) ;

導入數據

從本地源表導入Hive表。

INSERT INTO ex1.product_info SELECT * FROM product_info_export;

3.6 執行數據從hive導入dws表

導入數據

從本地源表導入Hive表。

INSERT INTO product_info_orc_export SELECT * FROM ex1.product_info;

4 總結

本文主要對GaussDB(DWS)對接hiveMetaStore的原理和方式做了闡述。

點擊關注,第一時間瞭解華爲雲新鮮技術~

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