《Presto實(shí)戰(zhàn)》筆記摘錄6

作者 | 士心先生
來源 | 程序員的讀書故事 (公眾號:pg_reading)

查詢執(zhí)行模型

Presto通常部署為包含一個協(xié)調(diào)器和多個工作節(jié)點(diǎn)的集群。

在協(xié)調(diào)器內(nèi)部,SQL語句首先以文本形式提交到協(xié)調(diào)器,協(xié)調(diào)器解析和分析這條語句,之后創(chuàng)建一個由Presto內(nèi)部數(shù)據(jù)結(jié)構(gòu)表示的執(zhí)行計劃,叫做查詢計劃。


presto2.png

查詢計劃生成過程利用了元數(shù)據(jù)SPI和數(shù)據(jù)統(tǒng)計SPI來創(chuàng)建查詢計劃。也就是說,協(xié)調(diào)器會使用SPI直接連接到數(shù)據(jù)源,以收集有關(guān)表和其他元數(shù)據(jù)的信息。

presto3.png

協(xié)調(diào)器通過元數(shù)據(jù)SPI獲取表、列和數(shù)據(jù)類型的信息。這些信息用于對查詢進(jìn)行語義校驗、類型檢查和安全檢查。

統(tǒng)計SPI用于獲取行數(shù)和表大小的信息,從而在計劃期間進(jìn)行基于代價的查詢優(yōu)化。
在創(chuàng)建分布式查詢計劃時會利用數(shù)據(jù)位置SPI來生成表內(nèi)容的邏輯切片。切片是任務(wù)分配和并行的最小單位。

分布式查詢計劃是簡單查詢計劃的一個擴(kuò)展,它包含一個或多個stage。簡單查詢計劃被切分為多個計劃片段。Stage是在運(yùn)行時的計劃片段,它包含對應(yīng)計劃片段所描述的所有任務(wù)。

協(xié)調(diào)器將查詢計劃切分成Stage,從而分配給集群中的多個工作節(jié)點(diǎn)進(jìn)行并行處理,從而加快整體查詢的執(zhí)行速度。多個Stage會被組織成一棵依賴樹。Stage的數(shù)量依賴于查詢的復(fù)雜度。例如,查詢的表、返回的列、JOIN語句、Where條件、Group by操作和其他SQL語句都可能影響Stage的數(shù)量。

presto4.png

分布式執(zhí)行計劃定義了Stage和查詢在Presto集群上執(zhí)行的方式。協(xié)調(diào)器使用它在工作節(jié)點(diǎn)上進(jìn)一步計劃和調(diào)度任務(wù)。一個Stage通常包含一個或多個任務(wù),每個任務(wù)則負(fù)責(zé)處理一小部分?jǐn)?shù)據(jù)。

一個任務(wù)處理數(shù)據(jù)的單位是切片。切片代表一個工作節(jié)點(diǎn)可以抽取并處理的一段底層數(shù)據(jù),它是并行和任務(wù)分配的單位。

presto5.png

源Stage的任務(wù)以page的形式生產(chǎn)數(shù)據(jù),每個page都是以列式存儲格式表示的一系列行。這些page傳輸?shù)较掠蔚闹虚gStage。Exchange算子從上游Stage中讀取數(shù)據(jù),從而在不同Stage之間傳輸page。

在連接器的幫助下,源任務(wù)使用數(shù)據(jù)源SPI從底層數(shù)據(jù)源獲取數(shù)據(jù)。這些數(shù)據(jù)以
page的形式在Presto的查詢引擎之中傳送。算子根據(jù)它們的語義處理接收到的page并產(chǎn)生新page。

包含在一個任務(wù)里的一串算子叫做流水線。流水線中的最后一個算子通常會將它輸出的page放置在任務(wù)的輸出緩沖區(qū)中。下游任務(wù)的Exchange算子會從上游任務(wù)的輸出緩沖區(qū)中消費(fèi)page。所有這些操作都在不同的工作節(jié)點(diǎn)上并行運(yùn)行。


presto6.png

因此,任務(wù)是運(yùn)行時分配給一個工作節(jié)點(diǎn)的計劃片段。在任務(wù)創(chuàng)建之后,它會為每個切片初始化一個驅(qū)動。每個驅(qū)動都是包含多個算子的流水線的一個實(shí)例,并且負(fù)責(zé)處理切片中的數(shù)據(jù)。根據(jù)Presto配置和環(huán)境,一個任務(wù)可以使用一個或多個驅(qū)動。當(dāng)所有驅(qū)動都執(zhí)行完且數(shù)據(jù)被傳送到下一個切片時,驅(qū)動和任務(wù)的工作就結(jié)束了,它們之后會被銷毀。


presto7.png

算子處理輸入數(shù)據(jù)并為下游算子生產(chǎn)輸出數(shù)據(jù)。常見的算子包括TableScan(表掃描)、Filter(過濾)、Join和Aggregate(聚合)。一系列相連的算子組成一套算子流水線。例如,你可以擁有一條流水線,它先掃描并讀入數(shù)據(jù),再過濾數(shù)據(jù),最后在數(shù)據(jù)上執(zhí)行局部聚合。

要處理一條查詢,協(xié)調(diào)器首先根據(jù)來自連接器的元數(shù)據(jù)創(chuàng)建切片列標(biāo)。使用該切片列表,協(xié)調(diào)器開始在工作節(jié)點(diǎn)上調(diào)度任務(wù),以獲取其中的數(shù)據(jù)。在查詢執(zhí)行期間,協(xié)調(diào)器跟蹤所有可用于處理的切片和任務(wù)在工作節(jié)點(diǎn)上執(zhí)行的位置。一些任務(wù)完成了處理,并產(chǎn)生了很多供下游處理的切片,協(xié)調(diào)器就會繼續(xù)調(diào)度更多的任務(wù)來處理它們,直到?jīng)]有待處理的切片為止。

一旦工作節(jié)點(diǎn)處理完了所有切片,全部數(shù)據(jù)就可用了。此時協(xié)調(diào)器會將結(jié)果返回給客戶端。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容