日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Presto基本概念

發布時間:2023/12/20 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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基本概念的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。