一、Presto 執行過程

Presto 執行流程圖
Presto 查詢引擎是一個 Master-Slave 架構,主要包括:
- Client:提交數據操作的窗口
- Coordinator:負責解析 SQL 語句,生成執行計划,分發執行任務給 Worker 節點執行。
- Discovery Server:通常內嵌於 Coordinator 節點中,用於發現 Worker 節點,存儲可用 Server(即 Worker)列表開。
- Connector Plugin:連接 Storag 元數據連接信息,支持 Hive、Kafka、MySQL 等數據源,可自定義。
- Worker 節點:負責實際執行查詢任務,負責與 HDFS 交互讀取數據。
查詢流程如下:
- Client 使用 HTTP 協議發送一個 query 請求。
- 通過 Discovery Server 發現可用的 Server。
- Coordinator 構建查詢計划(通過 Anltr3 解析為 AST(抽象語法樹),然后通過 Connector 獲取原始數據的 Metadata 信息,生成分發計划和執行計划)。
- Coordinator 向 Worker 發送任務。
- Worker 通過 Connector 插件讀取數據。
- Worker 在內存里執行任務(Worker 是純內存型計算引擎)。
- Worker 將數據返回給 Coordinator,匯總之后再響應客戶端。
二、Presto不足
通過 Presto 執行流程的架構,可以看出 Presto 在查詢上也存在一些不足:
- 沒有容錯能力,當一個 query 分發到多個 Worker 去執行時,當有一個 Worker 因為各種原因查詢失敗,Master 感知到之后,整個 query 也會失敗。
- 內存限制,由於 Presto 是純內存計算,所以當內存不夠時,Presto 並不會將結果 dump 到磁盤上,所以查詢也就失敗了。
- 並行查詢,因為所有的 task 都是並行執行,如果其中一台 Worker 因為各種原因查詢很慢,那么整個 query 就會變得很慢。
- 並發限制,因為全內存操作+內存限制,能同時處理的數據量有限,因而導致並發能力不足。
【參考資料】