Presto學習-presto介紹

Xlucas發表於2017-11-13

1、presto基本概念

1、1 presto服務程式
presto叢集中一共有兩種伺服器程式:coordinator服務程式和worker服務程式,其中coordinator服務程式的主要作用是:接收查詢請求、解析查詢語句、生成查詢執行計劃、任務排程和worker管理。而worker服務程式則執行被分解後的查詢執行任務:task
coordinator
coordinator服務程式部署於叢集中一個單獨的節點上,是整個presto叢集的管理節點,coordinator服務程式主要用於接收客戶端提交的查詢,查詢語句解析,生成查詢執行計劃、stage和task並對生成的task進行排程。除此之外,coordinator還對叢集中的所有worker進行管理,coordinator程式是整個presto叢集的master程式,該程式既與worker進行通訊從而獲得最新的worker資訊,又與client進行通訊,從而接受查詢請求,而所有的這些工作都是通過coordinator上的statementResource類提供的RESTful服務來完成的。
worker
在一個presto叢集中,存在一個coordinator節點和多個worker節點,coordinator節點是管理節點,而worker節點就是工作節點,在每個worker節點上都會存在一個worker服務程式,該服務程式主要進行資料的處理以及task的執行,worker服務程式每隔一定的時間都會向coordinator上的RESTful服務傳送心跳,從而告訴coordinator:我還活著,並接受你排程,當客戶端提交一個查詢的時候,coordinator則會從當前存活的worker列表中選擇出適合的worker節點去執行task,而worker在執行每個task的時候又會進一步對當前task讀入的每個split進行一系列的操作和處理

1、2 presto查詢執行模型
presto在執行SQL語句時,將這些SQL語句解析成相應的查詢,並在分散式叢集中執行這些查詢
statement
statement語句其實就是指我們輸入的SQL語句,presto支援符合ANSI標準的SQL語句,這種語句由子句(Clause)、表示式(Expression)和斷言(predicate)組成、
presto為什麼將語句(statement)和查詢(query)的概念分開呢?
因為在presto中,語句和查詢本身就是不同的概念,語句指的是終端使用者輸入的用文字表示的SQL的語句,當presto執行輸入的SQL語句時,會根據SQL語句生成查詢執行計劃,進而生成可以執行的查詢(Query),而查詢代表的是分佈到所有的worker之間執行的實際查詢操作
query
query即查詢執行,當presto接收一個SQL語句並執行時,會解析該SQL語句將其轉變成一個查詢執行和相關的查詢執行計劃,一個查詢執行代表可以在presto叢集中執行的查詢,是由執行在各個worker上且各自之間相互關聯的階段(stage)組成的
那麼SQL語句與查詢執行之間有什麼不同?
其實很簡單,你可以認為SQL語句就是提交給presto用文字表示的SQL執行語句,而查詢執行則是為了完成SQL語句所表述的查詢而例項化的配置資訊、元件、查詢執行計劃和優化資訊等。一個查詢執行由stage、task、driver、split、operator和DataSource組成。這些元件之間通過內部聯絡共同組成一個查詢執行,從而得到SQL語句表述的查詢,並得到相應的結果集。
stage
stage即 查詢執行階段,當presto執行query時。presto會將一個query拆分成具有層級關係的多個stage,一個stage就代表查詢執行的一部分,例如,當我們執行一個查詢,從hive的一張表具有1億記錄的表中查詢資料並進行聚合操作時,presto會建立一個Root Stage,該stage聚合其上游stage的輸出資料,然後將結果輸出給coordinator,並由coordinator將結果輸出給終端使用者。
通常情況下,stage之間是樹狀的層級結構,每個query都有一個Root Stage,該stage用於聚集所有其他stage的輸出資料,並將最終的資料反饋給終端使用者,需要注意的是,stage並不會再叢集中實際執行,它只是coordinator用於對查詢執行計劃進行管理和建模的邏輯概念,每個stage(除了single stage和source stage)都會有輸入和輸出,都會從上游stage讀取資料,然後將產生結果輸出給下游stage,需要注意的是,source stage沒有上游stage,它從coordinator獲取資料。single沒有下游,它的結果直接輸出給coordinator,並由coordinator輸出給終端使用者。

presto中的stage共分為4種,具體介紹如下
coordinator_Only:這種型別的stage用於執行DDL或者DML語句中最終的表結果建立或者更改。
single:這種型別的stage用於聚合子stage的輸出資料,並將最終資料輸出給終端使用者
fixed:這種型別的stage用於接受其子stage產生的資料並在叢集中對這些資料進行分散式的聚合或者分組計算。
source:這種型別的stage用於直接連線資料來源,從資料來源讀取資料,在讀取資料的時候,該階段也會根據presto對查詢執行計劃的優化完成相關的斷言下發和條件過濾等。
exchange
exchange的字面意思就是交換,presto的stage是通過exchange來連線另一個stage的,exchange用於完成有上下游關係的stage之間的資料交換,在presto中有兩種exchange:output Buffer和exchange client,生產資料的stage通過名為output buffer的exchange將資料傳送給其下游的stage。(根據資料的流向,分為上下游,你可以將presto中的查詢執行過程中的資料比喻成一條河流,那麼產生資料的stage對於消費資料的stage來說,就是上游)消費資料的stage通過名為exchange client的exchange從上游stage讀取資料。
如果當期的stage是source型別的stage。那麼該stage則是直接通過相應的connector從資料來源讀取資料的,而該stage則是通過名為source operator的operator與connector進行互動的,例如,如果一個source stage直接從HDFS獲取資料,那麼這種操作不是通過exchange client來完成的,而是通過執行於driver中的source operator來完成的。
task
從前面的章節我們可以知道,stage並不會在presto叢集中實際執行,它僅代表針對於一個SQL語句查詢執行計劃中的一部分查詢的執行過程,只是 用於對查詢執行計劃進行管理和建模,stage在邏輯上又被分為一系列的task,這些task則是需要實際執行在presto的各個worker節點上的,
在presto叢集中,一個查詢執行被分解成具有層級關係的一系列的stage。一個stage又被分為一系列的task,每個task處理一個或者多個split,每個task都有相應的輸入和輸出,一個stage被分解成多個task,從而可以並行的執行一個stage,task也採用了相同的機制,一個task也可以被分解為一個或者多個driver,從而並行地執行一個task。
driver
一個task包含一個或者多個driver,一個driver其實就是作用於一個split的一系列operator的集合,因此一個driver用於處理一個split,並且生成相應的輸出,這些輸出由task收集並且傳送給其下游stage中的一個task,一個driver擁有一個輸入和一個輸出
split
split即分片,一個分片其實就是一個大的資料集中的一個小的子集,而driver則是作用於一個分片上的一系列操作的集合,而每個節點上執行的task,又包含多個driver,從而一個task可以處理多個split,其中每一種操作均由一個operator表示,分散式查詢執行計劃的源stage通過connector從資料來源獲得多個分片,source stage對split處理完畢之後,會將輸出傳遞給其下游stage,
當presto執行一個查詢的時候,首先會從coordinator得到一個表對應的所有split,然後presto就會根據查詢執行計劃,選擇合適的節點執行相應的task處理split
page
page是presto中處理的最小資料單元,一個page物件包含多個block物件,而每個block物件是一個位元組陣列,儲存一個欄位的若干行,多個block橫切的一行的真實的一行資料,一個page最大為1MB,最多16*1024行資料,

presto中執行 一個查詢一共分為7步:

1、客戶端通過HTTP協議傳送一個查詢語句給presto叢集的coordinator
2、coordinator接到客戶端傳遞過來的查詢語句,會對該查詢語句進行解析,生成查詢執行計劃,並根據查詢執行計劃依次生成SqlQueryExecution、sqlStageExecution、HttpRemoteTask。coordinator會根據資料本地性生成對應的HttpRemoteTask
3、coordinator將每個task都分發到其所需要處理的資料所在的worker上進行執行,這個過程是通過HttpRemoteTask中的HTTPClient將建立或者更新task的請求發給資料所在節點上TaskResource所提供的RESTful介面,TaskResource接收到請求之後最終會在對應的worker上啟動一個sqlTaskExecution物件或者更新對應的sqlTaskExecution物件需要處理的split。
4、執行處於上游的source stage中的task,這些task通過各種connector從相應的資料來源中讀取所需要的資料
5、處於上游stage中的task會讀取上游stage產生的輸出結果,並在該stage每個task所在worker的記憶體中進行後續的計算和處理
6、coordinator從分發task之後,就會一直持續不斷地從single stage中的task獲取計算結果,並將計算結果快取到buffer中,直到所有計算結束
7、client從提交查詢語句之後,就會不停地從coordinator中獲取本次查詢的計算結果,直到獲得了所有的計算結果,並不是等到所有的查詢結果都產生完畢之後一次全部顯示出來,而是每產生一部分,就會顯示一部分,直到所有的查詢結果都顯示完畢

相關文章