分析外部OSS上的數(shù)據(jù)
本文介紹了使用列存索引功能查詢OSS上的外表數(shù)據(jù)的技術(shù)原理和使用方法等內(nèi)容。
背景信息
業(yè)務(wù)存續(xù)期間,隨著時間的推移,數(shù)據(jù)的規(guī)模不斷增加導(dǎo)致存儲成本上升。用戶在應(yīng)對激烈的市場競爭時,業(yè)務(wù)邏輯也在不斷地發(fā)生變化,對應(yīng)計算分析的復(fù)雜度也在提升,因此,計算性能至關(guān)重要。另外,一個完整的數(shù)據(jù)應(yīng)用,通常需要組合多個分析工具來完成不同的需求,數(shù)據(jù)需要流轉(zhuǎn)在不同的系統(tǒng)之間。
使用列存索引功能讀取OSS上的外表數(shù)據(jù)能很好的實現(xiàn)上述需求,優(yōu)勢如下:
OSS作為云原生的存儲方案有著非常高的性價比;
列存索引功能能夠提供超高的計算速度和計算的靈活性;
開放的數(shù)據(jù)存儲格式(如ORC、Parquet)有著廣泛的兼容性以及高壓縮比,便于數(shù)據(jù)在不同系統(tǒng)之間流轉(zhuǎn)。
技術(shù)原理
列存索引(IMCI)是一個高性能的列存分析引擎,相關(guān)文檔請參見PolarDB HTAP實時數(shù)據(jù)分析技術(shù)解密,ORC和Parquet也是列存格式,OSS支持高并發(fā)讀取,在高并發(fā)時可以獲取更高的網(wǎng)絡(luò)吞吐。因此,IMCI的并行掃描功能可以充分利用OSS的高帶寬,并通過并行計算或向量計算來提升CPU的使用效率,最終獲得極高的分析速度,并支持離線和實時數(shù)據(jù)的聚合分析。
典型應(yīng)用場景
以一個典型數(shù)倉架構(gòu)為例,通過ETL將在線數(shù)據(jù)(關(guān)系數(shù)據(jù)庫或者應(yīng)用服務(wù)日志)導(dǎo)入離線分析平臺做計算分析,分析的結(jié)果(如數(shù)倉模型的數(shù)據(jù)集市層ADS)再導(dǎo)入關(guān)系數(shù)據(jù)庫中,用于對接BI報告、監(jiān)控和廣告計算等應(yīng)用。
該架構(gòu)有幾個典型的瓶頸點:
將離線數(shù)倉分析結(jié)果導(dǎo)入關(guān)系型數(shù)據(jù)庫時,存在導(dǎo)入速度慢和存儲成本高等問題;
數(shù)據(jù)應(yīng)用層(ADS)并不只是簡單的查詢數(shù)據(jù)和分析結(jié)果,也存在大量的計算,甚至?xí)㈦x線數(shù)據(jù)和實時數(shù)據(jù)進行聚合分析,此時,行存格式的MySQL并不能很好的支撐這些操作。
使用該功能后,數(shù)據(jù)架構(gòu)如下圖所示:
該架構(gòu)既解決了數(shù)據(jù)應(yīng)用層(ADS)的存儲成本,同時也實現(xiàn)了高性能的“二次”即席分析以及離線或在線數(shù)據(jù)的整合分析。
注意事項
CREATE語句中必須添加
COMMENT='columnar=1'
和CONNECTION
信息。當(dāng)查詢同時涉及本地表和OSS外表時,需要在本地表上創(chuàng)建列存索引。
參數(shù)說明
參數(shù) | 說明 |
imci_ignore_schema_miss_match_oss_file | 掃描OSS上的數(shù)據(jù)文件時,是否忽略與Schema不匹配的文件。取值如下:
|
imci_oss_table_scan_unit | IMCI并行掃描的單次掃描范圍。 取值范圍:0~1000。默認(rèn)值為2。 |
imci_oss_max_retries | 讀取OSS上的外表數(shù)據(jù)失敗時的重試次數(shù)。 取值范圍:0~100。默認(rèn)值為0。 |
imci_oss_max_retriy_backoff_ms | 取值范圍:10~1000。默認(rèn)值為300。 |
imci_oss_scan_odps_compatible | 是否以O(shè)DPS兼容模式導(dǎo)出數(shù)據(jù)。取值如下:
|
使用方法
創(chuàng)建OSS外表。
通過CREATE語句建表,并標(biāo)明列類型、OSS連接信息以及OSS上的數(shù)據(jù)文件路徑。您可以使用以下兩種方式來標(biāo)明列類型。
第一種方式:從OSS數(shù)據(jù)文件中獲取列類型(推薦),如下所示:
CREATE FOREIGN TABLE `test` FROM CONNECTION='OSS://${oss_key}:${oss_key_secret}@${endpoint}/${bucket}/test.orc' COMMENT='columnar=1';
您可以使用
SHOW create table
tabname
命令來查看列類型,如下所示:第二種方式:在建表時指定列類型,如下所示:
CREATE TABLE `test` ( `r_regionkey` bigint(20), `r_name` text, `r_comment` text, PRIMARY KEY (`r_regionkey`) ) COMMENT='columnar=1' CONNECTION='OSS://${oss_key}:${oss_key_secret}@${endpoint}/${bucket}/test.orc'
其中,OSS連接信息可以寫在
CONNECTION
字段中。也可以先創(chuàng)建FOREIGH SERVER,然后在創(chuàng)建表時,在CONNECTION
字段引用FOREIGH SERVER的OSS連接信息。示例如下:CREATE SERVER test_oss_server FOREIGN DATA WRAPPER oss OPTIONS (EXTRA_SERVER_INFO '{"oss_bucket":"xxx, "oss_access_key_id":"xxx", "oss_endpoint":"xxx", "oss_access_key_secret":"xxx", "oss_prefix":"/test/path"}'); SELECT * FROM mysql.servers; CREATE TABLE `test` (...) COMMENT='columnar=1' CONNECTION='test_oss_server/test.orc';
上述配置用于讀取OSS上
/test/path/
路徑下的test.orc
文件中的數(shù)據(jù) 。如果需要讀取多個文件中的數(shù)據(jù),您可以在建表時指定文件所在目錄,且目錄以“/”結(jié)尾。示例如下:CREATE TABLE `test`(...) COMMENT='columnar=1' CONNECTION='OSS://${oss_key}:${oss_key_secret}@${endpoint}/${bucket}/orders/2022-09-01/'
上述配置用于讀取OSS上
orders/2022-09-01/
目錄下所有符合條件的文件中的數(shù)據(jù)。
對接MaxCompute導(dǎo)出數(shù)據(jù)。
執(zhí)行如下命令,將數(shù)據(jù)寫入OSS。
CREATE EXTERNAL TABLE IF NOT EXISTS mc_oss_orc_external ( vehicleId int, recordId int, patientId int, calls int, locationLatitute double, locationLongtitue double, recordTime string, direction string ) STORED AS orc LOCATION 'oss:///${oss_key}:${oss_key_secret}@oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo4/output/'; INSERT INTO TABLE mc_oss_orc_external SELECT * FROM mc_oss_orc_external;
上述命令會在
output
目錄下創(chuàng)建一個名稱為.odps
的文件夾,包含.meta
文件和保存ORC文件的文件夾。且每執(zhí)行一次寫入操作都會創(chuàng)建一個以日期為前綴的文件夾,來存放最近一次寫入的數(shù)據(jù)。如:output/.odps/20220413*********/****.orc
。以O(shè)DPS(MaxCompute)兼容模式建表和讀取數(shù)據(jù)。示例如下:
SET imci_oss_scan_odps_compatible=on; CREATE FOREIGN TABLE `test` FROM CONNECTION='oss:///${oss_key}:${oss_key_secret}@oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo4/output/' COMMENT='columnar=1'; SELECT count(*) FROM test;
說明開啟ODPS兼容模式讀取數(shù)據(jù)時,只讀最近一次寫入的數(shù)據(jù)。
性能測試
本次將使用TPC-H生成100 GB的數(shù)據(jù),來測試使用列存索引功能查詢OSS上外表中的數(shù)據(jù)的性能。
測試環(huán)境:Ice Lake 32C256 GB nvme本地盤。
關(guān)鍵參數(shù):imci_lru_cache_capacity=6710886400(6.7 GB)
測試結(jié)果:測試結(jié)果請參見下表:
SQL語句數(shù)量(單位:條)
執(zhí)行SQL語句耗時(單位:秒)
1
38.95
2
21.38
3
36.96
4
23.12
5
44.04
6
26.31
7
43.93
8
55.97
9
57.36
10
11.55
11
34.08
12
40.05
13
21.18
14
44.61
15
80.16
16
10.88
17
50.66
18
35.57
19
53.06
20
46.97
21
77.30
22
8.90