Presto 概念¶
總覽¶
要了解 Presto,您必須先了解 Presto 文件中使用的術語和概念。
雖然很容易理解陳述式和查詢,但作為最終使用者,您應該熟悉諸如階段和分割之類的概念,才能充分利用 Presto 來執行有效率的查詢。作為 Presto 管理員或 Presto 貢獻者,您應該了解 Presto 的階段如何對應到任務,以及任務如何包含一組處理資料的驅動程式。
本節為 Presto 中引用的核心概念提供了明確的定義,這些章節依據由一般到具體的順序排序。
伺服器類型¶
Presto 伺服器有三種類型:資源管理器、協調器和工作節點。以下章節說明它們之間的差異。
資源管理器¶
Presto 資源管理器是從所有協調器和工作節點聚合資料,並建構叢集全域視圖的伺服器。具有分離式協調器的 Presto 安裝需要資源管理器。叢集支援多個資源管理器,每個資源管理器都充當主要資源管理器。
協調器和工作節點使用 Thrift API 與資源管理器通訊。
協調器¶
Presto 協調器是負責解析陳述式、規劃查詢和管理 Presto 工作節點的伺服器。它是 Presto 安裝的「大腦」,也是客戶端連接以提交陳述式以執行節點。每個 Presto 安裝都必須有一個 Presto 協調器以及一個或多個 Presto 工作節點。對於開發或測試目的,可以將 Presto 的單個執行個體設定為執行這兩種角色。
協調器會追蹤每個工作節點上的活動並協調查詢的執行。協調器會建立一個查詢的邏輯模型,該模型涉及一系列階段,然後將其轉換為在 Presto 工作節點叢集上執行的一系列連線任務。
協調器使用 REST API 與工作節點和客戶端通訊。
工作節點¶
Presto 工作節點是 Presto 安裝中的一個伺服器,負責執行任務和處理資料。工作節點從連接器擷取資料,並彼此交換中繼資料。協調器負責從工作節點擷取結果,並將最終結果傳回給客戶端。
當 Presto 工作節點程序啟動時,它會向協調器中的探索伺服器宣告自己,這使其可供 Presto 協調器用於任務執行。
工作節點使用 REST API 與其他工作節點和 Presto 協調器通訊。
資料來源¶
在整個文件中,您會讀到諸如連接器、目錄、綱要和表格等術語。這些基本概念涵蓋了 Presto 特定資料來源的模型,並在以下章節中說明。
連接器¶
連接器可讓 Presto 適應諸如 Hive 或關係資料庫之類的資料來源。您可以將連接器視為資料庫的驅動程式。它是 Presto 的 SPI 的實作,可讓 Presto 使用標準 API 與資源互動。
Presto 包含幾個內建連接器:用於 JMX 的連接器、提供存取內建系統表格的 系統 連接器、Hive 連接器以及設計用於提供 TPC-H 基準測試資料的 TPCH 連接器。許多協力廠商開發人員已貢獻連接器,以便 Presto 可以存取各種資料來源中的資料。
每個目錄都與特定的連接器相關聯。如果您檢查目錄設定檔,您會看到每個目錄都包含一個強制性屬性 connector.name
,目錄管理員會使用該屬性為給定目錄建立連接器。可以使用多個目錄來使用相同的連接器來存取類似資料庫的兩個不同執行個體。例如,如果您有兩個 Hive 叢集,則可以在單個 Presto 叢集中設定兩個目錄,這兩個目錄都使用 Hive 連接器,允許您查詢來自兩個 Hive 叢集的資料 (即使在同一個 SQL 查詢中)。
目錄¶
Presto 目錄包含綱要,並透過連接器參考資料來源。例如,您可以設定 JMX 目錄,以透過 JMX 連接器提供對 JMX 資訊的存取權。當您在 Presto 中執行 SQL 陳述式時,您正在針對一個或多個目錄執行該陳述式。目錄的其他範例包括用於連線到 Hive 資料來源的 Hive 目錄。
在 Presto 中定址表格時,完整表格名稱始終以目錄為根。例如,hive.test_data.test
的完整表格名稱將會參考 hive
目錄中 test_data
綱要中的 test
表格。
目錄在儲存在 Presto 設定目錄中的屬性檔案中定義。
綱要¶
綱要是組織表格的方式。目錄和綱要一起定義一組可以查詢的表格。使用 Presto 存取 Hive 或 MySQL 等關係資料庫時,綱要會轉譯為目標資料庫中的相同概念。其他類型的連接器可能會選擇以對基礎資料來源有意義的方式將表格組織到綱要中。
表格¶
表格是一組無序的列,這些列被組織成具有類型的具名欄。這與任何關係資料庫中的相同。從來源資料到表格的對應由連接器定義。
查詢執行模型¶
Presto 執行 SQL 陳述式,並將這些陳述式轉換為在協調器和工作節點的分散式叢集中執行的查詢。
陳述式¶
Presto 執行與 ANSI 相容的 SQL 陳述式。當 Presto 文件提及陳述式時,它指的是 ANSI SQL 標準中定義的陳述式,這些陳述式由子句、運算式和述詞組成。
某些讀者可能想知道為什麼此章節為陳述式和查詢列出了不同的概念。這是必要的,因為在 Presto 中,陳述式僅指 SQL 陳述式的文字表示形式。當執行陳述式時,Presto 會建立查詢以及查詢計畫,然後將其分佈到一系列 Presto 工作節點。
查詢¶
當 Presto 解析語句時,會將其轉換為查詢,並建立一個分散式查詢計畫,然後在 Presto worker 上以一系列相互連接的階段來實現。當您在 Presto 中檢索有關查詢的資訊時,您會收到一個快照,其中包含所有參與產生回應語句的結果集的組件。
語句和查詢之間的區別很簡單。語句可以被視為傳遞給 Presto 的 SQL 文本,而查詢指的是實例化以執行該語句的配置和組件。一個查詢包含階段、任務、分割、連接器和其他協同工作以產生結果的組件和資料來源。
階段¶
當 Presto 執行查詢時,會將執行分解為一個階段層次結構。例如,如果 Presto 需要聚合儲存在 Hive 中的 10 億行資料,它會建立一個根階段來聚合其他多個階段的輸出,所有這些階段都旨在實現分散式查詢計畫的不同部分。
組成查詢的階段層次結構類似於一棵樹。每個查詢都有一個根階段,負責聚合其他階段的輸出。階段是協調器用來建模分散式查詢計畫的方式,但階段本身不會在 Presto worker 上執行。
任務¶
如上一節所述,階段對分散式查詢計畫的特定部分進行建模,但階段本身不會在 Presto worker 上執行。要理解階段是如何執行的,您需要理解一個階段是以一系列分佈在 Presto worker 網路上的任務來實現的。
任務是 Presto 架構中的「主力」。分散式查詢計畫被分解為一系列階段,然後轉換為任務,這些任務接著會對分割進行操作或處理。一個 Presto 任務有輸入和輸出,就像一個階段可以由一系列任務並行執行一樣,一個任務也可以與一系列驅動程式並行執行。
分割¶
任務操作的是分割,分割是較大資料集的一部分。分散式查詢計畫中最低層級的階段通過來自連接器的分割檢索資料,而分散式查詢計畫中較高層級的中間階段則從其他階段檢索資料。
當 Presto 排程查詢時,協調器會查詢連接器以取得可用於表格的所有分割列表。協調器會追蹤哪些機器正在執行哪些任務,以及哪些分割正在被哪些任務處理。
驅動程式¶
任務包含一個或多個並行的驅動程式。驅動程式對資料進行操作並組合運算子以產生輸出,然後由任務聚合並傳遞到另一個階段的另一個任務。驅動程式是一系列運算子實例。您可以將驅動程式視為記憶體中一組實際的運算子。它是 Presto 架構中最低層級的並行性。一個驅動程式有一個輸入和一個輸出。
運算子¶
運算子會消耗、轉換和產生資料。例如,表格掃描會從連接器獲取資料並產生可被其他運算子消耗的資料,而篩選運算子會消耗資料並通過將謂詞應用於輸入資料來產生子集。
交換¶
交換在查詢的不同階段之間在 Presto 節點之間傳輸資料。任務將資料寫入輸出緩衝區,並使用交換客戶端從其他任務消耗資料。