presto架構(gòu)和原理分析

架構(gòu)

架構(gòu)

Presto查詢引擎是一個Master-Slave的架構(gòu),由一個Coordinator節(jié)點漱办,一個Discovery Server節(jié)點这刷,多個Worker節(jié)點組成,
Discovery Server通常內(nèi)嵌于Coordinator節(jié)點中娩井。
Coordinator負(fù)責(zé)解析SQL語句暇屋,生成執(zhí)行計劃,分發(fā)執(zhí)行任務(wù)給Worker節(jié)點執(zhí)行洞辣。
Worker節(jié)點負(fù)責(zé)實際執(zhí)行查詢?nèi)蝿?wù)咐刨。

Worker節(jié)點啟動后向Discovery Server服務(wù)注冊,Coordinator從Discovery Server獲得可以正常工作的Worker節(jié)點屋彪。如果配置了Hive Connector所宰,需要配置一個Hive MetaStore服務(wù)為Presto提供Hive元信息,Worker節(jié)點與HDFS交互讀取數(shù)據(jù)畜挥。

  • 主從架構(gòu)
  • Coordinator
  • Worker
  • Discovery Server

執(zhí)行過程

提交查詢

用戶使用Presto Cli提交一個查詢語句后仔粥,Cli使用HTTP協(xié)議與Coordinator通信,Coordinator收到查詢請求后調(diào)用SqlParser解析SQL語句得到Statement對象蟹但,并將Statement封裝成一個QueryStarter對象放入線程池中等待執(zhí)行躯泰。

SQL編譯過程

sql編譯過程

邏輯執(zhí)行計劃

邏輯執(zhí)行計劃

虛線就是Presto對邏輯執(zhí)行計劃的切分點

邏輯計劃Plan生成的SubPlan分為四個部分,每一個SubPlan都會提交到一個或者多個Worker節(jié)點上執(zhí)行

查詢執(zhí)行流程

查詢執(zhí)行流程
  • 1.Cli通過HTTP協(xié)議提交SQL查詢之后华糖,查詢請求封裝成一個SqlQueryExecution對象交給Coordinator的SqlQueryManager#queryExecutor線程池去執(zhí)行

  • 2.每個SqlQueryExecution線程(圖中Q-X線程)啟動后對查詢請求的SQL進行語法解析和優(yōu)化并最終生成多個Stage的SqlStageExecution任務(wù)麦向,每個SqlStageExecution任務(wù)仍然交給同樣的線程池去執(zhí)行

  • 3.每個SqlStageExecution線程(圖中S-X線程)啟動后每個Stage的任務(wù)按PlanDistribution屬性構(gòu)造一個或者多個RemoteTask通過HTTP協(xié)議分配給遠(yuǎn)端的Worker節(jié)點執(zhí)行

  • 4.Worker節(jié)點接收到RemoteTask請求之后,啟動一個SqlTaskExecution線程(圖中T-X線程)將這個任務(wù)的每個Split包裝成一個PrioritizedSplitRunner任務(wù)(圖中SR-X)交給Worker節(jié)點的TaskExecutor#executor線程池去執(zhí)行

物理執(zhí)行計劃

物理執(zhí)行計劃

SubPlan的幾個屬性

planDistribution 分發(fā)方式

3種不同的PlanDistribution方式:
Source表示這個SubPlan是數(shù)據(jù)源客叉,Source類型的任務(wù)會按照數(shù)據(jù)源大小確定分配多少個節(jié)點進行執(zhí)行诵竭;
Fixed表示這個SubPlan會分配固定的節(jié)點數(shù)進行執(zhí)行(Config配置中的query.initial-hash-partitions參數(shù)配置话告,默認(rèn)是8);
None表示這個SubPlan只分配到一個節(jié)點進行執(zhí)行卵慰。

在下面的執(zhí)行計劃中沙郭,SubPlan1和SubPlan0 PlanDistribution=Source,這兩個SubPlan都是提供數(shù)據(jù)源的節(jié)點裳朋,SubPlan1所有節(jié)點的讀取數(shù)據(jù)都會發(fā)向SubPlan0的每一個節(jié)點病线;SubPlan2分配8個節(jié)點執(zhí)行最終的聚合操作;SubPlan3只負(fù)責(zé)輸出最后計算完成的數(shù)據(jù)鲤嫡。
outputPartitioning

OutputPartitioning屬性只有兩個值HASHNONE

表示這個SubPlan的輸出是否按照partitionBy的key值對數(shù)據(jù)進行Shuffle暖眼。在下面的執(zhí)行計劃中只有SubPlan0的OutputPartitioning=HASH,所以SubPlan2接收到的數(shù)據(jù)是按照rank字段Partition后的數(shù)據(jù)

partitionBy

低延時查詢核心技術(shù)

完全基于內(nèi)存的并行計算

上述查詢執(zhí)行流程赡突,均放在內(nèi)存線程中執(zhí)行

內(nèi)存中的數(shù)據(jù)模型

數(shù)據(jù)模型

Presto中處理的最小數(shù)據(jù)單元是一個Page對象区赵,Page對象的數(shù)據(jù)結(jié)構(gòu)如下圖所示。
一個Page對象包含多個Block對象漱受,每個Block對象是一個字節(jié)數(shù)組昂羡,存儲一個字段的若干行摔踱。多個Block橫切的一行是真實的一行數(shù)據(jù)。一個Page最大1MB蛹批,最多16*1024行數(shù)據(jù)篮愉。

流水線計算

流水線模型

流水線模型

左側(cè)是任務(wù)的執(zhí)行流程圖

Worker節(jié)點將最細(xì)粒度的任務(wù)封裝成一個PrioritizedSplitRunner對象,放入pending split優(yōu)先級隊列中猪勇。每個

Worker節(jié)點啟動一定數(shù)目的線程進行計算泣刹,線程數(shù)task.shard.max-threads=availableProcessors() * 4助析,在config中配置。

每個空閑的線程從隊列中取出一個PrioritizedSplitRunner對象執(zhí)行貌笨,如果執(zhí)行完成一個周期襟沮,超過最大執(zhí)行時間1秒鐘昌腰,判斷任務(wù)是否執(zhí)行完成开伏,如果完成,從allSplits隊列中刪除固灵,如果沒有巫玻,則放回pendingSplits隊列中仍秤。

每個任務(wù)的執(zhí)行流程如下圖右側(cè)可很,依次遍歷所有Operator,嘗試從上一個Operator取一個Page對象我抠,如果取得的Page不為空,交給下一個Operator執(zhí)行瓣窄。

本地化計算

Presto在選擇Source任務(wù)計算節(jié)點的時候俺夕,對于每一個Split啥么,按下面的策略選擇一些minCandidates

優(yōu)先選擇與Split同一個Host的Worker節(jié)點
如果節(jié)點不夠優(yōu)先選擇與Split同一個Rack的Worker節(jié)點
如果節(jié)點還不夠隨機選擇其他Rack的節(jié)點
對于所有Candidate節(jié)點贰逾,選擇assignedSplits最少的節(jié)點。

動態(tài)編譯執(zhí)行計劃

小心使用內(nèi)存和數(shù)據(jù)結(jié)構(gòu)

類BlinkDB的近似查詢

引入了一些近似查詢函數(shù)approx_avg氯迂、approx_distinct、approx_percentile

GC控制

參考鏈接
更多文章參見 微信號: life_361

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末禁灼,一起剝皮案震驚了整個濱河市弄捕,隨后出現(xiàn)的幾起案子导帝,更是在濱河造成了極大的恐慌,老刑警劉巖斋荞,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件平酿,死亡現(xiàn)場離奇詭異悦陋,居然都是意外死亡,警方通過查閱死者的電腦和手機柳刮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門秉颗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚕甥,你說我怎么就攤上這事栋荸。” “怎么了爱沟?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵呼伸,是天一觀的道長钝尸。 經(jīng)常有香客問我搂根,道長剩愧,這世上最難降的妖魔是什么娇斩? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮锦积,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己副签,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布冠场。 她就那樣靜靜地躺著碴裙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舔株。 梳的紋絲不亂的頭發(fā)上还棱,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天珍手,我揣著相機與錄音,去河邊找鬼琳要。 笑死,一個胖子當(dāng)著我的面吹牛童叠,可吹牛的內(nèi)容都是我干的课幕。 我是一名探鬼主播帖努,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拼余,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匙监?” 一聲冷哼從身側(cè)響起小作,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤顾稀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后静秆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡扶认,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年辐宾,在試婚紗的時候發(fā)現(xiàn)自己被綠了膨蛮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡吊洼,死狀恐怖冒窍,靈堂內(nèi)的尸體忽然破棺而出豺鼻,到底是詐尸還是另有隱情综液,我是刑警寧澤谬莹,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布附帽,位于F島的核電站,受9級特大地震影響整胃,放射性物質(zhì)發(fā)生泄漏喳钟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一蛮寂、第九天 我趴在偏房一處隱蔽的房頂上張望易茬。 院中可真熱鬧,春花似錦抽莱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悔捶。三九已至,卻和暖如春蜕该,著一層夾襖步出監(jiān)牢的瞬間犁柜,已是汗流浹背馋缅。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工绢淀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人覆履。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓硝全,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伟众。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353