簡介:
基於內存的並行計算,Facebook推出的分布式SQL交互式查詢引擎 多個節點管道式執行
支持任意數據源 數據規模GB~PB 是一種Massively parallel processing(mpp)(大規模並行處理)模型
數據規模PB 不是把PB數據放到內存,只是在計算中拿出一部分放在內存、計算、拋出、再拿
為什么要用&優點&特點
多數據源、支持SQL、擴展性(可以自己擴展新的connector)、混合計算(同一種數據源的不同庫 or表;將多個數據源的數據進行合並)、高性能、流水線(pipeline)
與其他組件的關系及對比
hive
數據倉庫 交互式略弱的查詢引擎 只能訪問HDFS文件 磁盤
但是presto是無法代替hive的
spark SQL
基於spark core mpp模式 詳細課件spark sql一文
kylin
cube預計算
Druid
時序,數據放內存 索引 預計算
缺點
不適合多個大表的join操作,因為presto是基於內存的,太多數據內存放不下的
如果一個presto查詢查過30分鍾,那
就kill吧,說明不適合 也違背了presto的實時初衷
基本概念
catalog
相當於MySQL的一個實例,
schema
相當於MySQL的database
presto查詢執行模型
- Statement語句 其實就是輸入的SQL
- Query 根據SQL語句生成查詢執行計划,進而生成可以執行的查詢(Query),一個查詢執行由Stage、Task、Driver、Split、Operator和DataSource組成
- Stage 執行查詢階段 Stage之間是樹狀的結構 ,RootStage 將結果返回給coordinator ,SourceStage接收coordinator數據 其他stage都有上下游 stage分為四種 single(root)、Fixed、source、coordinator_only(DML or DDL)
- Exchange 兩個stage數據的交換通過Exchange 兩種Exchange ;Output Buffer (生產數據的stage通過此傳給下游stage)Exchange Client (下游消費);如果stage 是source 直接通過connector 讀數據,則改stage通過Operator與connector交互
- stage 並不會被執行,只是對執行計划進行管理
- Task 實際運行在worker上的
- Driver 一個Driver處理一個split
- Operator 一個operator代表對一個split的一種操作 operator每次只會讀取一個paged對象
- Split 分片一個分片就是一個大的數據集中的一個小的子集
- Page presto中處理的最小數據單元 一個page包含多個block對象,每個block對象是個字節數據
一個查詢分解為多個stage 每個 stage拆分多個task,每個task處理一個or多個split ,一個task被分解為一個或多個Driver
硬件架構
大內存、萬兆網絡、高計算能力
軟件架構
presto 查詢引擎是一個Master-Slave的拓撲架構

coordinator
中心的查詢角色 接收查詢請求、解析SQL 生成執行計划 任務調度 worker管理
coordinator進行是presto集群的master進程
worker
執行任務的節點
connector
presto以插件形式對數據存儲層進行了抽象,它叫做連接器,不僅包含Hadoop相關組件的連接器還包括RDBMS連接器
具體訪問哪個數據源是通過catalog 中的XXXX.properties文件中connector.name決定的
提取數據 負責實際執行查詢計划
discovery service
將coordinator和worker結合在一起服務;
worker節點啟動后向discovery service服務注冊
coordinator通過discovery service獲取注冊的worker節點
要想使用presto 還需要客戶端 CLI客戶端 or 應用客戶端
工作原理
SQL運行過程
1、coordinator接到SQL后,通過SQL語法解析器把SQL語法解析變成一個抽象的語法樹AST,只是進行語法解析如果有錯誤此環節暴露
2、語法符合SQL語法,會經過一個邏輯查詢計划器組件,通過connector 查詢metadata中schema 列名 列類型等,將之與抽象語法數對應起來,生成一個物理的語法樹節點 如果有類型錯誤會在此步報錯
3、如果通過,會得到一個邏輯的查詢計划,將其分發到分布式的邏輯計划器里,進行分布式解析,最后轉化為一個個task
4、在每個task里面,會將位置信息解析出來,交給執行的plan,由plan將task分給worker執行
presto執行過程

低延遲原理
-
基於內存的並行計算
-
流水式計算作業
-
本地化計算
Presto在選擇Source任務計算節點的時候,對於每一個Split,按下面的策略選擇一些minCandidates
優先選擇與Split同一個Host的Worker節點
如果節點不夠優先選擇與Split同一個Rack的Worker節點
如果節點還不夠隨機選擇其他Rack的節點 -
動態編譯執行計划
-
GC控制
容錯
1、如果某個worker掛了,discovery service 會通知coordinator
2、對於query是沒有容錯的,一旦worker掛了,query就執行失敗了,與其在這里容錯不如直接執行
3、coordinator 和discovery service 的單點故障問題還沒有解決