概述
StarRocks提供了開箱即用的資料湖查詢功能,適用於對湖中的資料進行探查式查詢分析。Paimon是新一代的資料湖格式,提供了以下核心功能:
高效即時更新:高吞吐和低延遲的資料攝入和更新
統一的批處理和流處理:同時支援批量讀寫和流式讀寫
豐富的資料湖功能:ACID, Time Travel 和 Schema Evolution等
本文將介紹StarRocks基於Paimon湖格式的查詢分析的情境與實踐。
StarRocks + Paimon應用情境
湖倉分析:Flink+Paimon入湖,並利用StarRocks的分析能力更好地賦能給Paimon。
批處理:Paimon入湖作為ODS層之後,基於StarRocks物化視圖來簡化Pipeline的維護成本
整體資料存放區在Paimon資料湖格式上,用StarRocks對湖上資料直接做查詢加速
開啟Data Cache提升查詢效能
基於資料湖構建adhoc能力
情境:StarRocks + Paimon資料打造流批一體方案
資料在Paimon上,不直接查詢,需要再做一些加工(ODS->DWD->DWS->ADS),把資料做寬表、彙總操作、結果表等,給上層使用者提供簡單統一介面。
基於外表的物化視圖構建,透明加速,定時重新整理
依賴 StarRocks 物化視圖實現 ETL 資料加工,採用 StarRocks 原生格式進行高效轉換
情境:BI報表,高並發低延遲報表
資料存放區於 Paimon,通過 StarRocks 作為計算引擎執行 ETL 任務,結果通過Data Sink寫回資料湖
支援物化視圖自動調度與外部調度機制
利用其物化視圖自動調度與資源隔離能力實現高效資料加工
將結果通過 Data Sink 寫入資料湖
情境:資料都在Paimon上,跨引擎資料共用需求
StarRocks針對Paimon的最佳化能力
物化視圖加速:
提供非同步重新整理的物化視圖能力,支援分區級資料更新;
自動緩衝熱資料至 StarRocks 記憶體,結合查詢改寫技術動態選擇執行路徑。
Paimon 批量寫入:
原生支援 Paimon 表的 Batch Sink,相容 Append/Update 表類型,確保加工結果即時回寫資料湖。
查詢功能增強:
完整支援 Paimon 表 DDL 操作與 Time Travel 查詢,實現資料版本精確追溯
效能最佳化引擎:
使用 Native ORC/Parquet Reader 讀取資料;
中繼資料快取與分散式處理機制,最佳化大規模查詢;
完善統計資訊,提升CBO查詢規劃能力。
資料入湖
StarRocks查詢Paimon湖格式的加速方式
在3.2.9及以上版本的StarRocks執行個體,StarRocks在建立Paimon Catalog後,可以直接查詢Paimon表資料。
StarRocks 作為 OLAP 查詢引擎需要掃描 HDFS 或Object Storage Service上的資料檔案。查詢實際讀取的檔案數量越多,I/O 開銷也就越大。此外,在即席查詢 (ad-hoc) 情境中,如果頻繁訪問相同資料,還會帶來重複的 I/O 開銷。
StarRocks通過使用Data Cache、非同步物化視圖等能力,可以為資料湖中的報表和應用實現更高的並發,以及更好的效能。
在以下情況下,建議優先通過Data Cache來實現加速:
查詢沒有大量可複用的部分,並且可能涉及資料湖中的任何資料。
遠程儲存存在顯著的波動或不穩定性,可能會對訪問產生潛在影響。
建議在以下情況下使用物化視圖:
在啟用了Data Cache的情況下,查詢效能仍不符合您對查詢延遲和並發性的要求。
查詢涉及可複用的部分,如固定的彙總方式、Join模式。
資料以分區方式組織,而查詢彙總度較高(例如按天彙總)。
使用 StarRocks開啟Delection Vector查詢Paimon資料湖格式
開啟方式:主鍵表建表語句配置'deletion-vectors.enabled' = 'true'
例如:
create table dv4 (
id int,
name string
) tblproperties (
'bucket' = '1',
'primary-key' = 'id',
'file.format' = 'parquet',
'deletion-vectors.enabled' = 'true'
);使用 StarRocks開啟Data Cache查詢Paimon資料湖格式
StarRocks提供了 Data Cache 功能。通過將外部儲存系統的未經處理資料按照一定策略切分成多個 block 後,緩衝至 StarRocks 的本地節點,來避免重複的遠端資料拉取開銷,實現熱點資料查詢分析效能的進一步提升。StarRocks Data Cache已支援Paimon資料湖格式。
開啟Data Cache的步驟
# 對於3.3版本,data cache,預設為true。對於3.2版本,data cache,預設為false,需要開啟
datacache_enable=true
# 單個磁碟快取資料量的上限,值可以為百分比,也可以為Byte數。預設為20%,即20%的磁碟最大容量。本樣本修改為20GB
datacache_disk_size=21474836480
# 記憶體快取資料量的上限,值可以為百分比,也可以為Byte數。預設為10%,本樣本修改為4GB
datacache_mem_size=4294967296
# 緩衝使用的磁碟路徑,不可修改
datacache_disk_path=/opt/starrocks/be/storage/disk1/datacache在叢集重啟完成後,在SQL Editor中執行
SET GLOBAL enable_scan_datacache = true;即可使Data Cache在全域生效。
命中Data Cache
再次執行Paimon查詢,如果命中了緩衝,可以看到明顯的查詢效率提升。可以通過Query Profile查看是否命中了緩衝。
開啟profile後,在全部查詢中,點擊查詢的id,進入profile頁面下載profile,觀察下述指標,即能夠說明Data Cache的命中情況。
DataCacheReadBytes:從記憶體和磁碟中讀取的資料量。
DataCacheWriteBytes:從外部儲存系統載入到記憶體和磁碟的資料量。
如以下的樣本顯示,該查詢在Data Cache裡讀取了10.107 GB的資料,而從外部檔案系統中沒有讀取資料,表示緩衝完全命中。
- DataCache:
- DataCacheReadBlockBufferBytes: 920.146 MB
- __MAX_OF_DataCacheReadBlockBufferBytes: 14.610 MB
- __MIN_OF_DataCacheReadBlockBufferBytes: 1.762 MB
- DataCacheReadBlockBufferCounter: 27.923K (27923)
- __MAX_OF_DataCacheReadBlockBufferCounter: 440
- __MIN_OF_DataCacheReadBlockBufferCounter: 55
- DataCacheReadBytes: 10.107 GB
- __MAX_OF_DataCacheReadBytes: 163.518 MB
- __MIN_OF_DataCacheReadBytes: 20.225 MB
- DataCacheReadDiskBytes: 563.468 MB
- __MAX_OF_DataCacheReadDiskBytes: 30.965 MB
- __MIN_OF_DataCacheReadDiskBytes: 0.000 B
- DataCacheReadMemBytes: 9.556 GB
- __MAX_OF_DataCacheReadMemBytes: 142.791 MB
- __MIN_OF_DataCacheReadMemBytes: 20.225 MB
- DataCacheReadCounter: 41.456K (41456)
- __MAX_OF_DataCacheReadCounter: 655
- __MIN_OF_DataCacheReadCounter: 81
- DataCacheReadTimer: 9.157ms
- __MAX_OF_DataCacheReadTimer: 48.792ms
- __MIN_OF_DataCacheReadTimer: 478.759us
- DataCacheSkipReadBytes: 0.000 B
- DataCacheSkipReadCounter: 0
- DataCacheWriteBytes: 0.000 B
- DataCacheWriteCounter: 0
- DataCacheWriteFailBytes: 0.000 B
- DataCacheWriteFailCounter: 0
- DataCacheWriteTimer: 0ns在生產環境中,資料緩衝的效能在不同查詢模式下表現各異,通常能夠實現從幾十個百分點到數倍的提升。
使用 StarRocks 構建非同步物化視圖查詢Paimon資料湖格式
生產環境中的應用程式經常基於多個大表執行複雜查詢,涉及大量的資料關聯和彙總。處理此類查詢會大量消耗系統資源和時間,導致極高的查詢成本。StarRocks可以使用非同步物化視圖解決此問題。
如果您在生產環境經常需要執行此查詢,可以通過建立一個非同步物化視圖來加速查詢,具體步驟可參考:使用物化視圖加速資料湖查詢
物化視圖構建完成後,再次執行查詢,StarRocks可以自動改寫查詢SQL,從物化視圖裡直接讀取資料。
實際生產環境中,物化視圖應用在對查詢延遲要求非常高的情境,通常物化視圖的構建方式會極大影響最終查詢耗時,需要您根據業務需求和歷史的查詢SQL進行總結,選擇合適的物化視圖構建方式來滿足具體的業務需求。
向Paimon表寫入資料
在StarRocks中,寫入Paimon表的方式為批量寫入(Batch Write)。由於Paimon的限制,無法對Bucket Mode為HASH_DYNAMIC或CROSS_PARTITION的表進行寫入。一個典型的情境是,當寫入主鍵表時,如果該表的建表語句中的PROPERTIES未指定bucket,預設值將為-1(即Dynamic Bucket Mode),這將導致無法執行寫入操作。
Paimon SDK要求寫入的資料中的分區鍵或主鍵列不可為空白值,而StarRocks在寫入Paimon表時不會對即將寫入的資料進行預檢查,因此如果嘗試將空值寫入到包含值的Chunk時,將會拋出異常。
INSERT INTO <catalog_name>.<database_name>.<table_name> (column1, column2, ...) VALUES (value1, value2, ...);例如,直接向ads_age_pvalue_analytics表插入以下資料。
INSERT INTO dlf_catalog.sr_dlf_db.ads_age_pvalue_analytics (final_gender_code, age_level, pvalue_level, clicks, total_behaviors)
VALUES
('M', '18-24', 'Low', 1500, 2500),
('F', '25-34', 'Medium', 2200, 3300),
('M', '35-44', 'High', 2800, 4000);Paimon資料匯入至內表
假設StarRocks中存在一個OLAP表,表名為olap_tbl。您可以按照以下方式將Paimon表中的資料轉換,並匯入到StarRocks的olap_tbl表中。
INSERT INTO default_catalog.olap_db.olap_tbl SELECT * FROM <paimon_catalog>.<db_name>.<table_name>;