StarRocks 數(shù)據(jù)湖查詢和遷移實(shí)踐
一、StarRocks 和 Paimon 湖能力的介紹
1. 為什么需要數(shù)據(jù)湖架構(gòu)
為什么需要數(shù)據(jù)湖?與其它技術(shù)一樣,數(shù)據(jù)湖本身也是由需求而生的。早期都是離線數(shù)倉(cāng),為了應(yīng)對(duì)現(xiàn)在數(shù)據(jù)分析中越來(lái)越多的實(shí)時(shí)性場(chǎng)景,以及對(duì) ACID、事物性隔離越來(lái)越高的要求,數(shù)據(jù)湖技術(shù)應(yīng)運(yùn)而生。傳統(tǒng)的數(shù)據(jù)湖三劍客為 Iceberg、Hudi 和 Delta lake,從去年開(kāi)始,開(kāi)源的 Apache Paimon 這個(gè)正在蓬勃發(fā)展的數(shù)據(jù)湖格式,已成為一顆冉冉升起的新星。
數(shù)據(jù)湖架構(gòu)的主要優(yōu)點(diǎn)有三大方面:
- 首先是湖倉(cāng)一體的管理能力。它具有完整的ACID 事務(wù)能力,Schema Evolution 以及擴(kuò)展性強(qiáng),且很適應(yīng)大規(guī)模數(shù)據(jù)的處理,同時(shí)它也有具有完整的版本管理以及 Time Travel。
- 第二大優(yōu)點(diǎn)就是開(kāi)源開(kāi)放統(tǒng)一存儲(chǔ),不像一些閉源的軟件,格式都是其自己的,很容易 Lock in 到某些廠商去。在實(shí)際應(yīng)用中,Apache Paimon 作為一個(gè)開(kāi)源格式,與其它所有開(kāi)源格式一樣可以使用不同的底層存儲(chǔ),也可以適配不同的計(jì)算引擎,比如可以使用Flink 做流計(jì)算,Spark 做批計(jì)算,OLAP 做實(shí)時(shí)分析等等。
- 第三大優(yōu)點(diǎn)就是成本和性能之間的平衡。如果在云上,可以構(gòu)建在低廉的對(duì)象存儲(chǔ)上,與流的結(jié)合還可以更好地提升時(shí)效性。另外,它還支持豐富的索引,從而提升查詢性能。
這些優(yōu)勢(shì)正是我們選擇數(shù)據(jù)湖架構(gòu)的理由。
2. Paimon 概述
Paimon 是一個(gè)新興的湖格式,它可以很好地結(jié)合 Flink 和 Spark 構(gòu)建實(shí)時(shí)數(shù)據(jù)湖,用于流式和批處理操作。起初它只是 Flink 內(nèi)置的 Table Store 的一個(gè)格式,之后經(jīng)過(guò)漫長(zhǎng)的發(fā)展,成為了一個(gè)獨(dú)立完整的項(xiàng)目,今年從 ASF 孵化出來(lái),成為一個(gè)正式的頂級(jí)項(xiàng)目。Paimon 可以完整地支持批處理和流處理,它創(chuàng)新性地將 LSM Tree 與湖格式相結(jié)合,具有更高效的實(shí)時(shí)更新能力。與其它湖格式相比,有著更優(yōu)的讀寫性能,以及更高的 compaction 效率。
3. Paimon 優(yōu)勢(shì)
Paimon 的優(yōu)勢(shì)主要在以下四大方面:
- 第一是實(shí)時(shí)更新。它支持流式更新,最低 1 分鐘的時(shí)效性,而且很靈活,可以支持部分列更新以及聚合更新,同時(shí)它也可以產(chǎn)生變更日志,給下游進(jìn)行流讀。
- 第二是流寫流讀。Paimon 就是從 Flink 的內(nèi)置格式中誕生的,所以它與 Flink 的配合非常好,支持 Flink 流讀流寫。現(xiàn)在與 Spark 的結(jié)合很成熟,是 Spark 最佳的批計(jì)算組合。
- 第三是高性能查詢。支持高性能 OLAP、提供點(diǎn)查以及豐富的索引。完備的索引支持是 Paimon 社區(qū)正在大力發(fā)展的特性之一,如 bitmap、布隆過(guò)濾器等。
- 第四是大規(guī)模離線處理能力。Paimon 支持傳統(tǒng)的超大規(guī)模的數(shù)據(jù)量,并對(duì) Append 表提供了完整支持。
4. StarRocks+Paimon 極速數(shù)據(jù)湖分析
StarRocks+Paimon 的最大優(yōu)勢(shì)是查詢快,可以用來(lái)替代傳統(tǒng)的 OLAP 分析方案。
例如使用 Paimon 為底座的數(shù)據(jù)湖,假設(shè)用 Presto、Trino 或者 Impala 去查的速度作為基準(zhǔn),不做任何其它更改,僅是將查詢引擎換成 StarRocks,就可以帶來(lái)三倍的性能提升。這主要是由于 StarRocks 有著非常優(yōu)秀的 CBO 優(yōu)化器,以及完整的向量化執(zhí)行引擎,并且在讀取數(shù)據(jù)湖進(jìn)行 IO 操作的時(shí)候,做了非常細(xì)粒度的管理,比如 IO 合并以及延遲物化技術(shù)等。
如果想要更大的性能提升,只需要開(kāi)啟 StarRocks 的本地緩存功能 Data Cache,BE 端配置一下本地緩存的磁盤路徑,就可以使用了。在啟動(dòng)緩存之后,可以得到 6 倍的性能提升。
利用 StarRocks 外表的物化視圖功能,還可以得到更快的查詢速度。使用該功能,StarRocks 會(huì)把湖上的數(shù)據(jù)轉(zhuǎn)換成自己的格式存起來(lái),當(dāng)成是自己的內(nèi)表進(jìn)行存儲(chǔ)、索引構(gòu)建,這樣就可以得到 10 倍的性能提升。
同時(shí),Paimon 物化視圖可以支持多種查詢特性,比如透明加速,即查詢表的時(shí)候,用戶可以不感知物化視圖的存在,而是將其當(dāng)成 StarRocks 的一個(gè)外表就可以了,SQL 里是 StarRocks 的外表,但 StarRocks 會(huì)將查詢自動(dòng)路由到物化視圖,用物化視圖去加速查詢并返回?cái)?shù)據(jù)。
Paimon 物化視圖還支持查詢改寫,物化視圖的構(gòu)建很多時(shí)候是與查詢 pattern 緊密相關(guān)的。例如,查詢 pattern 是三個(gè)表的 join,對(duì)這三個(gè)表做了物化視圖之后,又想查其中兩個(gè)表的 join 結(jié)構(gòu),StarRocks 的查詢改寫可以不需要再重復(fù)建兩個(gè)表的物化視圖,支持自動(dòng)把這兩個(gè)表的 join 改寫到原來(lái)基于三個(gè)表的物化視圖上,達(dá)到查詢加速度的目的。
物化視圖也支持嵌套分層,在一個(gè)物化視圖在上面再加一層物化視圖,也就是可以起到數(shù)據(jù)建模的作用。
Paimon 還具備冷熱分離的功能。業(yè)務(wù)的數(shù)據(jù)量是一直上漲的,很多離線加工任務(wù)積攢了多年的數(shù)據(jù),但實(shí)際 OLAP 查詢最多也就查近幾年、近幾個(gè)月或者近幾天的數(shù)據(jù)。StarRocks 冷熱分離功能,配置物化視圖只存近幾天的數(shù)據(jù),剩下的數(shù)據(jù)都在廉價(jià)對(duì)象存儲(chǔ)上。用戶只要寫一個(gè) SQL,不需要關(guān)心數(shù)據(jù)從哪來(lái),StarRocks 會(huì)自動(dòng)去解析這個(gè) SQL、做一些合理的 plan,自動(dòng)判斷哪些數(shù)據(jù)可以直接從物化視圖讀,哪些數(shù)據(jù)到湖格式上讀,然后把這兩個(gè)部分的結(jié)果 union 出來(lái),最后返回到最終結(jié)果里。冷熱分離的效果,相當(dāng)于熱數(shù)據(jù)查詢永遠(yuǎn)都很快,因?yàn)橹苯用形锘晥D,但冷數(shù)據(jù)依然可以保存在廉價(jià)存儲(chǔ)的外表里,達(dá)到降本增效的目的。
以上,就是 StarRocks+Paimon 的極速數(shù)據(jù)庫(kù)分析方案,以及在構(gòu)造一個(gè)湖分析方案時(shí)如何獲得更高的性能。
二、遷移 StarRocks 方案介紹
1. Trino/Presto 遷移
上文提到,Trino 直接換成 StarRocks 就有 3 倍的性能提升,但對(duì)于業(yè)務(wù)來(lái)說(shuō)直接遷移引擎不可避免地會(huì)帶來(lái)業(yè)務(wù)的改造和改 SQL 的情況,如果 SQL 很大很長(zhǎng),改起來(lái)會(huì)比較麻煩。接下來(lái)將分享如何減少業(yè)務(wù)遷移的痛點(diǎn)。
如果業(yè)務(wù)是從 Presto 或者 Trino 遷移到 StarRocks,這是最簡(jiǎn)單的,不需要任何改動(dòng),因?yàn)?StarRocks 已經(jīng)內(nèi)置了 Trino 的語(yǔ)法解析器。只要在 StarRocks 里設(shè)置 set sql_dialect=“Trino”,原來(lái) Trino 的 SQL 直接放進(jìn) StarRocks 就可以自動(dòng)完成解析,將 Trino 語(yǔ)法的 SQL 轉(zhuǎn)換成 StarRocks 自己的邏輯計(jì)劃以及物理執(zhí)行計(jì)劃,最后執(zhí)行返回。我們?cè)诙嗉铱蛻舻膶?shí)際案例中測(cè)試,對(duì) Trino 和 Presto 的兼容度基本在 90% 以上。剩下的就是一些 Corner Case,比如一些很少用到的地理計(jì)算函數(shù)或數(shù)學(xué)計(jì)算函數(shù)等,才會(huì)出現(xiàn)不兼容的情況。
2. Hive/Spark-SQL/Impala/Doris/Clickhouse 遷移
除了最常用的 Trino、Presto,大家還會(huì)用到一些其它的計(jì)算引擎,比如傳統(tǒng)的 Impala、Doris、ClickHouse、Hive、Spark SQL 等,如果想往 StarRocks 遷移,可以參考一個(gè)開(kāi)源項(xiàng)目——SQLGlot,它相當(dāng)于一個(gè) SQL 轉(zhuǎn)換器,支持各種 SQL 的轉(zhuǎn)換,使用特別簡(jiǎn)單,本質(zhì)上是一個(gè) python 程序,下載下來(lái)就可以直接用。
如上圖中所示,轉(zhuǎn)換方法就是填寫三個(gè)參數(shù),第一個(gè)參數(shù)是要轉(zhuǎn)換的 SQL,第二個(gè)參數(shù)是 read 參數(shù),告訴它這個(gè) SQL 是什么引擎的 SQL 語(yǔ)法,比如例子中的是“duckdb”,第三個(gè)參數(shù)是 write 參數(shù),告訴它要轉(zhuǎn)換成什么引擎的 SQL 語(yǔ)法,例子中的是“hive”。最后運(yùn)行一下,就可以完成 SQL 轉(zhuǎn)換。
這個(gè)項(xiàng)目除了 SQL 轉(zhuǎn)換,還有 SQL 優(yōu)化、SQL 格式化、SQL 語(yǔ)法檢查等功能。當(dāng)我們的客戶想把其它引擎遷移到 StarRocks 的時(shí)候,尤其是 Impala,我們經(jīng)常會(huì)推薦這個(gè)項(xiàng)目。
3. StarRocks 集群間遷移
下面介紹 StarRocks 集群間的遷移。假如現(xiàn)在已經(jīng)有了一個(gè) StarRocks 集群,但是版本非常老,想要升級(jí)到最新版本。最好的方案就是開(kāi)一個(gè)新集群,然后把數(shù)據(jù)復(fù)制過(guò)來(lái),等數(shù)據(jù)復(fù)制完成之后,業(yè)務(wù)直接切換過(guò)去即可。如果新的集群有問(wèn)題,還可以直接一鍵回滾。如果直接原地升級(jí),當(dāng)遇到遇到問(wèn)題的時(shí)候,還得做降級(jí),業(yè)務(wù)也得跟著中斷,這樣來(lái)回做一些反復(fù)的操作,對(duì)業(yè)務(wù)是有顯著影響的。
這里介紹一個(gè) StarRocks 集群間遷移的具體方法,除了做遷移,很多客戶也用這個(gè)工具做熱備和災(zāi)備。如上圖中所示,左右兩個(gè)框代表兩個(gè)集群,這個(gè)工具可以把原集群所有的數(shù)據(jù)自動(dòng)同步到新的目標(biāo)集群,實(shí)際上就是 copy 數(shù)據(jù),延遲大概在分鐘級(jí),可以做到準(zhǔn)實(shí)時(shí)。在數(shù)據(jù)同步中,原集群不用做任何修改,導(dǎo)數(shù)、刪表、加分區(qū)、刪分區(qū)等 DDL 操作、導(dǎo)入操作帶來(lái)的數(shù)據(jù)變更都會(huì)無(wú)縫地通過(guò)這個(gè)工具遷移到新集群去。這樣等新集群準(zhǔn)備好后,業(yè)務(wù)就可以直接切換了,或者干脆將其作為一個(gè)災(zāi)備系統(tǒng)也是可以的。
使用這個(gè)工具非常簡(jiǎn)單,下載好后,配置一些必要的參數(shù),如配置兩邊集群的 IP、用戶名密碼等,即可開(kāi)始使用。
4. 使用阿里云 EMR StarRocks 構(gòu)建基于 Paimon 極速實(shí)時(shí)湖倉(cāng)分析架構(gòu)
大家在使用 StarRocks 的時(shí)候,經(jīng)常會(huì)遇到一些運(yùn)維問(wèn)題,接下來(lái)介紹阿里云 StarRocks 基于 Paimon 的極速實(shí)時(shí)分析架構(gòu)。阿里云的 EMR Serverless StarRocks 分為三個(gè)版本,一個(gè)是存算一體,另外一個(gè)是存算分離,第三個(gè)是今天重點(diǎn)講的數(shù)據(jù)湖分析。
- 存算一體就相當(dāng)于 StarRocks 內(nèi)表的一個(gè)版本,用 StarRocks 自己的格式去存數(shù)據(jù),用于高并發(fā)和實(shí)時(shí)數(shù)據(jù)分析查詢。
- 存算分離版本,數(shù)據(jù)是存到 OSS 等對(duì)象存儲(chǔ)上,BE/CN 可以支持動(dòng)態(tài)伸縮,并支持多 Warehouse。存算分離集群支持資源硬隔離、讀寫分離、Cache 管理能力。
- 數(shù)據(jù)湖分析版本,兼容 Trino/Presto 語(yǔ)法,適用于數(shù)據(jù)湖、數(shù)據(jù)倉(cāng)庫(kù)分析的場(chǎng)景,如果有外部數(shù)據(jù)存儲(chǔ)在 HDFS 或者 OSS 上,開(kāi)通之后就可以做即席查詢,無(wú)需任何配置。
上面是用 StarRocks 做數(shù)據(jù)湖分析的一個(gè)截圖。主要包括兩步:第一步,以 Paimon為例建一個(gè) Catalog,CREATE EXTERNAL CATALOG paimon_fs_catalog,添加一個(gè)參數(shù)用來(lái)指定 paimon 數(shù)據(jù)所在對(duì)象存儲(chǔ)的位置,最后就可以直接查詢 Paimon 數(shù)據(jù)湖里的數(shù)據(jù)了。
關(guān)于前面介紹的數(shù)據(jù)加速的物化視圖部分,可以參考上圖中第二個(gè)紅框中的代碼,即 CREATE MATERIALIZED VIEW 語(yǔ)法創(chuàng)建物化視圖,指定好物化視圖的刷新頻率,比如例子中的刷新頻率是 1 分鐘,保存好之后,就可以直接查詢這個(gè)物化視圖了。
阿里云的 EMR Serverless StarRocks 包含了各種各樣運(yùn)維和管控能力,例如查詢分析,Profile 可視化,導(dǎo)入分析,用戶權(quán)限分析,數(shù)據(jù)血緣分析等。
三、StarRocks + Paimon 未來(lái)規(guī)劃
- 第一部分是支持 Paimon 元數(shù)據(jù)緩存,這是目前最高優(yōu)、最重要的任務(wù)之一。為何特別重要,是因?yàn)?StarRocks 物化視圖刷新是支持按分區(qū)刷新的,按分區(qū)刷新需要感知外表哪些分區(qū)有更新,只刷新有更新的分區(qū)。感知分區(qū)刷新就是獲取元數(shù)據(jù)的過(guò)程,外表一般數(shù)據(jù)量都很大,獲取元數(shù)據(jù)的成本也比較高,而且把元數(shù)據(jù)都緩存下來(lái),也可以給后續(xù)查詢直接復(fù)用,提高整體查詢效率。
- 第二部分是完善 Paimon 統(tǒng)計(jì)信息和索引支持。目前重點(diǎn)在索引支持,主要包含兩個(gè)方面:一個(gè)是布隆過(guò)濾器,另一個(gè)是 bitmap 索引。StarRocks 也需要能夠處理這些索引格式,在 reader 中高效地利用這些索引數(shù)據(jù)。
- 第三部分是支持 Paimon 表格式的寫入,希望直接用 StarRocks 去寫 Paimon 的表格式。
- 第四部分是大規(guī)模數(shù)據(jù)表的讀取性能優(yōu)化,這個(gè)主要是內(nèi)存優(yōu)化。內(nèi)存優(yōu)化主要是拉取元數(shù)據(jù)或者讀數(shù)據(jù)的時(shí)候可以盡量減少內(nèi)存的消耗。
以上就是本次分享的主要內(nèi)容。