編者按
隨著企業(yè)內(nèi)外部數(shù)據(jù)源的增加,呈現(xiàn)出數(shù)量龐大、種類繁多、質(zhì)量參差不齊等特點。如何讓這些結(jié)構(gòu)復雜、類型各異的數(shù)據(jù)發(fā)揮價值,對于大多數(shù)企業(yè)來說,最有效的途徑是建立起一套能夠統(tǒng)一數(shù)據(jù)源的技術(shù)體系和管理體系。
滴普科技經(jīng)過技術(shù)沉淀與實踐,探索出基于Trino分析引擎連接多類數(shù)據(jù)源,實現(xiàn)快速查詢與分析的技術(shù)解決方案,并將此回饋給技術(shù)開發(fā)者社區(qū)。
撰文 | 曉云
編輯 | 昕然
本文共計1300字,閱讀需要3分鐘
在之前的FastData連載文章中,介紹“統(tǒng)一SQL引擎”時提到了Trino,本文對Trino+ Iceberg技術(shù)做相關(guān)解讀。
Trino是針對OLAP設計的用于高效的分布式查詢大量數(shù)據(jù)的分析引擎。主要具備下列優(yōu)點:屏蔽底層數(shù)據(jù)源,提供統(tǒng)一查詢接口;基于內(nèi)存計算,可以跨不同數(shù)據(jù)源完成聯(lián)邦查詢;通過Trino進行異構(gòu)數(shù)據(jù)的提取、整合與分析,打破數(shù)據(jù)孤島、提高數(shù)據(jù)治理能力。
1
Trino 架構(gòu)
Trino的架構(gòu)如圖一所示。由一個coordinator和多個worker節(jié)點組成的Trino集群。Trino用戶通過一個客戶端連接到coordinator。coordinator與訪問數(shù)據(jù)源的worker進行協(xié)作。一旦它接收到一條SQL語句,協(xié)調(diào)器就負責跨Trino工作節(jié)點解析、分析、計劃和調(diào)度查詢執(zhí)行。該語句被轉(zhuǎn)換為運行在一組worker上的一系列連接的任務。當worker處理數(shù)據(jù)時,coordinator將檢索結(jié)果并在輸出緩沖區(qū)上向客戶機公開。
在Trino中,存儲和計算分離的核心是基于connector的體系結(jié)構(gòu)。connector為Trino提供了訪問任意數(shù)據(jù)源的接口。
如圖二所示,每個connector都提供了對底層數(shù)據(jù)源的基于表的抽象。只要可以使用Trino可用的數(shù)據(jù)類型以表、列和行來表示數(shù)據(jù),就可以創(chuàng)建connector,查詢引擎就可以使用數(shù)據(jù)進行查詢處理。目前支持的connector包括:Hive, Iceberg, MySQL, PostgreSQL, Oracle, SQL Server, ClickHouse, MongoDB等。
Trino connector體系結(jié)構(gòu)
2
Trino Iceberg connector
Iceberg 是一種用于跟蹤超大規(guī)模表的,構(gòu)建于存儲格式之上的數(shù)據(jù)組織方式,通常將其作為數(shù)據(jù)湖底層存儲。它具備下列能力:
1. 模式演化:支持添加,刪除,更新或重命名,并且沒有副作用。
2. 支持隱藏分區(qū)和分區(qū)演化,方便業(yè)務進行數(shù)據(jù)分區(qū)策略更新。
3. 快照控制:可實現(xiàn)使用完全相同的表快照的可重復查詢,或者使用戶輕松檢查更改。
4. 版本回滾:使用戶可以通過將表重置為良好狀態(tài)來快速糾正問題。
5. 快速掃描數(shù)據(jù):無需使用分布式SQL引擎即可讀取表或查找文件。
6. 數(shù)據(jù)修剪優(yōu)化:使用表元數(shù)據(jù)使用分區(qū)和列級統(tǒng)計信息修剪數(shù)據(jù)文件。
7. 兼容性好:可以存儲在任意的云存儲系統(tǒng)和HDFS中。
8. 支持事務:上游數(shù)據(jù)寫入即可見,不影響當前數(shù)據(jù)處理任務,這大大簡化了 ETL。
9. 高并發(fā):高并發(fā)寫入器使用樂觀并發(fā),即使寫入沖突,也會重試以確保兼容更新成功。
圖三 Iceberg表格式
此外,Iceberg支持通過流式方式讀取增量數(shù)據(jù);支持多種引擎,并且提供了java native API,不用特定引擎也可以訪問Iceberg表。
Trino 引入Iceberg connector的設計改進了Hive已知的可伸縮性限制。Hive將表元數(shù)據(jù)存儲在一個metastore中,該metastore由關(guān)系數(shù)據(jù)庫(如MySQL)支持。它跟蹤分區(qū)在metastore的位置,但無法定位到單獨的數(shù)據(jù)文件。使用Hive connector的Trino查詢必須首先調(diào)用metastore來獲取分區(qū)位置,然后調(diào)用底層文件系統(tǒng)來列出每個分區(qū)內(nèi)的所有數(shù)據(jù)文件,然后從每個數(shù)據(jù)文件中讀取元數(shù)據(jù)。在文件量大的情況下,這是一個非常耗時的操作。
Iceberg提供了表級別的抽象接口,自己在文件中維護表的元數(shù)據(jù)信息(而非通過Hive Metastore維護)。基于此,Iceberg對于表的元數(shù)據(jù)管理以及表數(shù)據(jù)本身如何組織存儲進行了封裝(如圖三所示),查詢可以定位到文件級別,大幅提高了查詢效率。
此外,Trino Iceberg connector 在查詢優(yōu)化方面支持分區(qū)下推,Projection 下推,動態(tài)過濾等提高查詢效率。
3
總 結(jié)
為了獲取更高的查詢性能,Trino可以將查詢或部分查詢的處理下推到連接的數(shù)據(jù)源中。這意味著特定的謂詞、聚合函數(shù)或其他操作被傳遞到底層數(shù)據(jù)庫或存儲系統(tǒng)進行處理;另一方面可以通過添加索引的方式,加快查詢。
責任編輯:Rex_08