本文分享自華為雲社區《對接HiveMetaStore,擁抱開源大數據》,作者:睡覺是大事。 1. 前言 適用版本:9.1.0及以上 在大數據融合分析時代,面對海量的數據以及各種複雜的查詢,性能是我們使用一款數據處理引擎最重要的考量。而GaussDB(DWS)服務有著強大的計算引擎,其計算性能優於MR ...
本文分享自華為雲社區《對接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的原理和方式做了闡述。