解密數倉的SQL ON ANYWHERE技術

本文分享自華爲雲社區《GaussDB DWS的SQL ON ANYWHERE技術解密》,作者:tooooooooooomy。

1. 前言

  • 適用版本:【8.1.1(及以上)】

查詢分析是大數據要解決的核心問題之一,雖然大數據相關的處理引擎組件種類繁多,並提供了豐富的接口供用戶使用,但相對傳統數據庫用戶來說,SQL語言依然是使用最簡單、最廣泛和方便的一種接口。如果能在一個客戶端中使用SQL語句操作不同的大數據組件,將極大提升使用各種大數據組件的效率。

2. 什麼是SQL On Anywhere

GaussDB(DWS)的SQL On Anywhere,主要指對大數據的文件系統和與其他異構數據庫的訪問和交互,構築起統一的大數據計算平臺。大數據文件系統主要包括HDFS和OBS,其他異構數據庫主要包括Oracle、Spark和Other GaussDB(DWS)。

3. GaussDB(DWS)SQL On Anywhere的作用及其應用場景

通過SQL On Anywhere特性可以實現與其他大數據組件和數據庫互聯互通訪問,可以直接同時處理本地和HDFS/OBS上的數據集,甚至其他異構數據庫的數據,而無需導入導出數據,將其分析能力從本地存儲擴展到數據湖中,擴大GaussDB DWS的大數據分析的應用場景;通過該特性可以幫助客戶實現冷熱數據分離,將使用頻度更高的熱數據存儲在本地,而使用頻度更低的冷數據存儲在成本更低廉的共享存儲HDFS或者DWS上,降低用戶成本。

img

從應用場景來看,可以滿足如下業務需求:

  • 針對多數據源需要構建虛擬的統一數據倉庫,實現多數據源聯邦查詢,跨數據倉庫熱數據和HDFS/OBS冷數據的複雜混合查詢,需要提供一致的、熟悉的數據倉庫操作體驗。
  • 滿足低頻的業務全數據的低成本低延遲即席查詢。

4. GaussDB(DWS)SQL On Anywhere的實現方式

GaussDB(DWS)SQL On Anywhere針對大數據的文件系統的訪問主要通過FDW或ELK機制(已停止演進)實現的,而跨數據庫的訪問主要通過EC+ODBC的方式實現的。

img

3.1 利用FDW訪問HDFS/OBS數據

GaussDB(DWS)對存儲在HDFS上的Hadoop或者OBS原生數據的訪問,採用FDW(Foreign Data Wrapper)機制,也稱外表機制。首先通過創建Foreign Data Server來定義對HDFS數據源或同構其他集羣的連接信息;之後創建Foreign Table,用於在GaussDB A數據庫內部系統表中,定義對應的HDFS數據源上Hadoop原生結構化數據表的結構或對應同構其他集羣結構化數據表的結構。

例如讀取hdfs上的數據,其流程如下:

​ 1)建立一個hdfs_server,其中hdfs_fdw爲數據庫中存在的foreign data wrapper。

--創建hdfs_server。
postgres=# CREATE SERVER hdfs_server FOREIGN DATA WRAPPER HDFS_FDW OPTIONS 
   (address '10.146.187.231:8000,10.180.157.130:8000' ,
    hdfscfgpath '/opt/hadoop_client/HDFS/hadoop/etc/hadoop', 
    type 'HDFS'
) ;

​ 2)創建一個hdfs外表讀取hdfs上的數據

CREATE FOREIGN TABLE region (
   R_REGIONKEY INT4,
   R_NAME TEXT,
   R_COMMENT TEXT )
SERVER  hdfs_server
OPTIONS(
    FORMAT 'orc',
    FOLDERNAME '/user/hive/warehouse/mppdb.db/region_orc11_64stripe/'
)
DISTRIBUTE BY roundrobin;

​ 3)查詢HDFS外表,例如:

select * from region limit 10;

目前外表支持與普通表進行關聯查詢,並支持多種文件存儲格式,其支持的文件格式如下(不同版本能力可能存在差異,以官方文檔爲準):

3.2 通過ELK訪問HDFS(已停止演進,不推薦)

ELK的方式類似於HAWQ,它是通過建立表空間爲HDFS表空間,直接將數據存儲和訪問HDFS文件系統,目前只支持訪問HDFS文件系統,而不支持訪問OBS上的數據。首先通過創建HDFS表空間,然後會創建一個HDFS表,在創建時指定表空間爲HDFS表空間,最後對HDFS表的操作如同普通表的操作,可進行插入修改刪除數據。

以GaussDB數據庫數據推到HDFS中

​ 1)在數據庫中創建HDFS表空間

CREATE TABLESPACE hdfs_table RELATIVE LOCATION ‘tmp/hdtest’
With (filesystem=’hdfs’,
	address=’28.4.136.221:9000’,
	cfgpath=’/opt/Huawei/bigdata/mppdb/hdfs_conf/zhndnrop/[email protected]/’,
	storepath=’/tmp/test’);

​ 2)數據庫中創建HDFS表

CREATE TABLE abc(
	zjxxlh char(20),
	nbbsh char(20),
	khwybh char(20),
	zjlx char(20)
)WITH (orientation=orc) TABLESPACE tables_hdfs;

​ 3)向表中插入數據

insert into abc select * from region10;

3.3 基於EC+ODBC的跨集羣訪問數據

GaussDB(DWS)支持通過 EC(全稱Extension Connector)+ODBC統一訪問其它大數據組件——將SQL發給其它大數據組件並接收執行結果,實現跨集羣訪問數據。目前EC+ODBC爲用戶提供了三種功能: SQL on Oracle、SQL on Spark和SQL on other GaussDB,分別用於連接Oracle數據庫、Spark集羣和其他GaussDB集羣。

EC+ODBC的基本工作原理是:用戶首先構建Data Source對象(其中包含目標庫的一些連接信息和字符編碼方式),然後用戶獲取該Data Source的使用權限,最後通過標準ODBC API連接目標庫,發送SQL語句並獲取執行結果。

爲了方便使用,EC+ODBC爲用戶提供了統一的連接函數exec_on_extension(text, text)。其中,第一個參數爲Data Source名稱,第二個參數爲發送的SQL語句,例如:

postgres=# SELECT * FROM exec_on_extension('ds_spark', 'select * from a;') AS (c1 int);

5. GaussDB(DWS) SQL On Anywhere的實現方式優缺點對比

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

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