Presto基本概念
Presto基本概念
Presto是Facebook開源的MPP SQL引擎,旨在填補Hive在速度和靈活性(對接多種數據源)上的不足。相似的SQL on Hadoop競品還有Impala和Spark SQL等。這里我們介紹下Presto的基本概念,為后續的筆記做基礎。
Operator Model & Iterator Model
MPP(Massive Parellel Processing)系統的鼻祖是一個叫Volcano的并行數據庫(論文在此),它提出了一種并行執行SQL的設計,即通過各種Operator(如TableScan、Project、Filter、Aggregate、Exchange、Join等)組成一棵樹,樹的根節點產生SQL輸出,樹的葉子節點是各種TableScan,數據從葉子節點流入,一步步被加工直至產生最終結果。這個模型稱為Operator Model,這棵樹我們稱之為執行計劃(Plan,在傳統數據庫里又分為邏輯計劃和物理計劃)。
在Operator Model執行的過程中,各節點有三種基本狀態(或者說要實現三個接口):Open、GetNext、Close。父節點的接口調用一般會遞歸調用子節點對應的接口。SQL執行時就從根節點Open開始,然后不斷調其GetNext接口得到一行輸出(后續演變為得到RowBatch),直到沒有結果為止,最后調Close。這個模型稱為Iterator Model。
Stage
在MPP系統里,一個執行計劃經常會被切分為各種子樹(一般稱為PlanFragment),每個子樹可以并行地在多臺機器上執行。PlanFragment之間通過Exchange Operator來傳遞數據,這里就有很多技術(如Shuffle、Broadcast等)。
Presto中一個Stage就對應一個PlanFragment。在Presto的Web UI里可以看到如下的Stage連接圖,整個執行計劃被劃分為若干Stage,每個Stage里都有一個PlanFragment。還可以看到Stage里有很多Operator,我們后面再說。?
Task
Stage只是定義了執行計劃怎么劃分,接下來會被調度到各個機器上去執行,每一個實例就稱為一個Task,也就是說Presto里Task是Stage的實例。一般來說,一臺機器(Presto里的Worker)只會運行一個Stage的一個實例。當然它會跑多個Task,但它們一般來說是屬于不同的Stage的。因為理論上來說同一個Stage的Task實例是相同的,在一臺機器上跑兩個跟跑一個是機同的(Task里面已經有并行了)。
在Presto的Web UI里可以看到如下的Task Overview,默認情況下一個Stage最多在一個Worker上跑一個Task。Task ID由兩部分組成,第一部分是Stage ID,第二部分為該Task在對應Stage里的ID。可以看到同個Stage下的不同Task是跑在不同機器上的(一般一臺機器只跑一個Presto Worker)。?
Pipeline
每個Task執行一個Stage的邏輯,也可以說就是執行一個PlanFragment里的Operator,這些Operator的最佳并行度可能是不同的。比如說做Tablescan的并發可以很大,但做Final Aggregation(如Sort)的并發度只能是一。基于這個考慮,一個PlanFragment又會被切分為若干Pipeline,每個Pipeline由一組Operator組成,這些Operator被設置同樣的并行度。Pipeline之間會通過LocalExchangeOperator來傳遞數據。
在Presto的Web UI里可以看到下面的Pipeline圖。Driver的數目就是這個Pipeline的并行度。?
Driver
Pipeline其實是一個虛擬的概念,它的實例就叫Driver。可以說Pipeline就是DriverFactory,用來create Driver的。每一個Driver由一串Operator組成,負責接收一組輸入數據,并產生一組輸出數據。Driver里不再有并行度,每個Driver都是單線程的。
Split
Split就是一組數據,可以認為是一個RowBatch,也可以說是Table的一個分片。對于Hive中的表,一個Split就是HDFS文件的一個分片。可能是一個Block的大小(如果文件格式支持分片,如ORC、Parquet等),也可能是整個文件(如果文件格式不支持分片,如zip文件)。具體地,可以看源碼中HiveSplit的定義:
public class HiveSplitimplements ConnectorSplit {private final String clientId;private final String path; // HDFS中的文件路徑private final long start; // Split在文件中的起始位置private final long length; // Split的長度private final Properties schema;private final List<HivePartitionKey> partitionKeys;private final List<HostAddress> addresses; // 對應Block所在的DataNode地址private final String database;private final String table;private final String partitionName;private final TupleDomain<HiveColumnHandle> effectivePredicate;private final OptionalInt bucketNumber;private final boolean forceLocalScheduling;private final Map<Integer, HiveType> columnCoercions;... }總結
Presto的基本概念就介紹到這里,總結一下:
- Stage對應一個PlanFragment
- Task是Stage的實例
- 每個PlanFragment會被拆分為若干Pipeline
- Pipeline的實例是Driver
- Split是Table的一個分片,在Hive中可以對應HDFS文件的一個分片
總結
以上是生活随笔為你收集整理的Presto基本概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fopen与读写的标识r,r+,rb+,
- 下一篇: 飞机大战素材