presto原始碼學習1——Presto概述
presto是基於Java語言開發的一個用來即席查詢大資料的查詢引擎,是facebook公司的一個開源產品
相關文件
- git地址:https://gitee.com/mirrors/presto.git
- 官方文件
presto的特點
特點 | 說明 |
---|---|
多資料來源 | presto目前支援包括mysql、hive等多種常用儲存 |
擴充套件性 | presto支援開發者自定義開發可插拔式的資料來源外掛 |
混合計算 | presto支援同一個叢集接入多個同一種儲存元件,比如一個presto叢集可以接入兩個以上的hive叢集,並且支援對這兩個不同的hive叢集的資料進行join查詢和計算 |
高效能 | presto是完全基於記憶體的平行計算,查詢速度是hive的十倍之上 |
presto中的角色
如圖所示,presto一次查詢中主要涉及下面三種角色:
- client:發起資料查詢請求方,方式有:pre-cli、jdbc等
- Coordinator:presto叢集中的管理節點,主要負責接收資料查詢的請求、解析查詢語句、生成查詢計劃、任務排程和叢集節點管理等
- worker:是presto叢集重的工作節點,主要負責執行Coordinator節點分發的資料計算操作
其中,worker節點會定期向Coordinator節點發送心跳,而Coordinator節點會維護存活的worker節點列表,並從中選擇合適的worker節點用來執行具體的計算任務
presto的相關概念
Connector
可以理解為presto用來訪問不同資料來源的驅動或是外掛,目前支援的connector有hive、mysql、kafka、kudu等,這些connector都實現了presto定義的spi介面,如果需要自定義特殊的資料來源,也可以通過實現這個spi介面來開發特定的外掛
Catalog
presto的catalog相當於我們經常說的mysql例項,可以在$PRESTO_HOME/etc/catalog/下通過新增.properties檔案來習總能catalog,其中檔名就是catalog名,我們可以通過定義不同的catalog來接入不同的資料儲存,比如hive、mysql等,檔案中的具體配置資訊可以直接參考presto提供的楊例配置,比較清晰
Schema
schema就相當於我們平常用的資料庫了,當presto訪問hive或者mysql資料庫時,schema就會轉換為目標資料庫中相同的概念
Table
presto中的資料表定義與其他資料庫中的表定義是一樣的
presto的查詢執行模型
Statement
就是客戶端向presto叢集提交的SQL查詢語句
Query
presto會將接收到的Statement語句進行解析,然後轉化成一個query,並生成查詢計劃
與statement不同的是,Query包含了查詢計劃以及後面要介紹的Stage、Task、Split等很多用來進行資料計算的概念和元件,可以理解為statement就是sql語句,而query是一次查詢執行
Stage
presto在執行Query的時候,會把每一個query切分成多個前後關聯的stage,但這只是一個邏輯概念,是在coordinator中用來生成分散式查詢計劃的,本身不會在worker中執行
stage可以分為以下四種:
- Source:負責連線資料來源,從資料來源讀取資料的一個階段
- Fixed:接收其他stage的產出作為輸入,然後對資料進行分散式計算的stage
- Single(Root):聚合其他stage的產出,並將資料輸出給使用者的階段
- Coordinator_Only:執行DDL、DML相關的stage
Task
stage邏輯上又被分為一系列的task,這些task就是後面要實際在worker上執行的任務,並且這些task可以並行的執行
Split
split:資料分片,是對資料集的一個切分,每個task負責處理一個或多個數據split
Operator
一個Operator代表對Split的一種操作,比如過濾、加權、轉換等。一個Operator回依次讀取每個資料分片重的資料,並將operator代表的計算和操作應用在資料上,然後產生輸出
Driver
一個task包含多個Driver,其中,Driver是一系列Operator的集合,並且將相應的輸出傳遞給他的task,task將收集到的輸出結果傳送給下一個stage中的一個task
Exchange
presto的stage通過exchange來進行資料傳遞,可以分為output buffer和exchange client兩種。
其中,生產資料的stage通過output buffer將資料傳遞給下游的stage,消費資料的stage通過exchange client叢上游stage讀取資料