1. 程式人生 > 實用技巧 >presto原始碼學習1——Presto概述

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讀取資料