presto中的名詞

presto服務進程 

presto集羣中一共有兩種服務器進程:coordinator服務進程和worker服務進程,其中coordinator服務進程的主要做用是:接收查詢請求、解析查詢語句、生成查詢執行計劃、任務調度和worker管理。而worker服務進程則執行被分解後的查詢執行任務:task mysql

coordinator 

coordinator服務進程部署於集羣中一個單獨的節點上,是整個presto集羣的管理節點,coordinator服務進程主要用於接收客戶端提交的查詢,查詢語句解析,生成查詢執行計劃、stage和task並對生成的task進行調度。除此以外,coordinator還對集羣中的全部worker進行管理,coordinator進程是整個presto集羣的master進程,該進程既與worker進行通訊從而得到最新的worker信息,又與client進行通訊,從而接受查詢請求,而全部的這些工做都是經過coordinator上的statementResource類提供的RESTful服務來完成的。sql

 worker 

在一個presto集羣中,存在一個coordinator節點和多個worker節點,coordinator節點是管理節點,而worker節點就是工做節點,在每一個worker節點上都會存在一個worker服務進程,該服務進程主要進行數據的處理以及task的執行,worker服務進程每隔必定的時間都會向coordinator上的RESTful服務發送心跳,從而告訴coordinator:我還活着,並接受你調度,當客戶端提交一個查詢的時候,coordinator則會從當前存活的worker列表中選擇出適合的worker節點去運行task,而worker在執行每一個task的時候又會進一步對當前task讀入的每一個split進行一系列的操做和處理數據庫

數據源

Connector

connector是presto可使用hive或者關係型數據庫。你能夠認爲connector是一種數據庫驅動,它使得presto能夠用標準的api去操做數據源。api

presto有許多內置的connector,JMX、Hive等等。不少第三方也提供了一些操做各類數據源的connector。數組

每一個connector包含一個catalog。你查看catalog配置,你會發現每個都包含一個屬性connector.name。connector manager 經過這個屬性建立相應的connector。有時候你有多個catalog用相同的connector去鏈接相同數據源的不一樣實例。好比,你有兩個hive集羣,你能夠在一個presto集羣中配置兩個catalog都用hive connector,你能夠同時從兩個hive集羣中查找數據。服務器

Catalog

一個presto catalog 包括connector的schema和reference。好比,你能夠在connector中配置 JMX catalog去獲取JMX相關信息。當你在presto中運行一個sql,你能夠在多個catalog上運行。其它的例子如hive catalog鏈接hive數據源。分佈式

在presto中查找一張表的時候,表的全名在catalog中。好比,hive.test_data.test指的是在hive catalog中,test_data schema中的test表。優化

catalog在配置文件中定義,存儲在presto配置文件目錄。spa

Schema

schema是組織表的一種方式。一個catalog和schema定義了能夠查詢的表的集合。presto 鏈接hive或者關係型數據如mysql時,schema對應於數據庫。其它類型的connector可能選擇一種有意義的方式把表放在schema裏。rest

Table

一個表是一系列無序的帶有類型的列組成的一行的集合。關係型數據庫也是如此。數據源到表的映射關係被connector定義。

查詢執行模型

presto在執行SQL語句時,將這些SQL語句解析成相應的查詢,並在分佈式集羣中執行這些查詢

statement 

statement語句其實就是指咱們輸入的SQL語句,presto支持符合ANSI標準的SQL語句,這種語句由子句(Clause)、表達式(Expression)和斷言(predicate)組成、 
presto爲何將語句(statement)和查詢(query)的概念分開呢? 
由於在presto中,語句和查詢自己就是不一樣的概念,語句指的是終端用戶輸入的用文字表示的SQL的語句,當presto執行輸入的SQL語句時,會根據SQL語句生成查詢執行計劃,進而生成能夠執行的查詢(Query),而查詢表明的是分佈到全部的worker之間執行的實際查詢操做 

query 

query即查詢執行,當presto接收一個SQL語句並執行時,會解析該SQL語句將其轉變成一個查詢執行和相關的查詢執行計劃,一個查詢執行表明能夠在presto集羣中運行的查詢,是由運行在各個worker上且各自之間相互關聯的階段(stage)組成的 
那麼SQL語句與查詢執行之間有什麼不一樣? 
其實很簡單,你能夠認爲SQL語句就是提交給presto用文字表示的SQL執行語句,而查詢執行則是爲了完成SQL語句所表述的查詢而實例化的配置信息、組件、查詢執行計劃和優化信息等。一個查詢執行由stage、task、driver、split、operator和DataSource組成。這些組件之間經過內部聯繫共同組成一個查詢執行,從而獲得SQL語句表述的查詢,並獲得相應的結果集。 

stage 

stage即 查詢執行階段,當presto運行query時。presto會將一個query拆分紅具備層級關係的多個stage,一個stage就表明查詢執行的一部分,例如,當咱們執行一個查詢,從hive的一張表具備1億記錄的表中查詢數據並進行聚合操做時,presto會建立一個Root Stage,該stage聚合其上游stage的輸出數據,而後將結果輸出給coordinator,並由coordinator將結果輸出給終端用戶。 
一般狀況下,stage之間是樹狀的層級結構,每一個query都有一個Root Stage,該stage用於彙集全部其餘stage的輸出數據,並將最終的數據反饋給終端用戶,須要注意的是,stage並不會再集羣中實際執行,它只是coordinator用於對查詢執行計劃進行管理和建模的邏輯概念,每一個stage(除了single stage和source stage)都會有輸入和輸出,都會從上游stage讀取數據,而後將產生結果輸出給下游stage,須要注意的是,source stage沒有上游stage,它從coordinator獲取數據。single沒有下游,它的結果直接輸出給coordinator,並由coordinator輸出給終端用戶。

presto中的stage共分爲4種,具體介紹以下 
coordinator_Only:這種類型的stage用於執行DDL或者DML語句中最終的表結果建立或者更改。 
single:這種類型的stage用於聚合子stage的輸出數據,並將最終數據輸出給終端用戶 
fixed:這種類型的stage用於接受其子stage產生的數據並在集羣中對這些數據進行分佈式的聚合或者分組計算。 
source:這種類型的stage用於直接鏈接數據源,從數據源讀取數據,在讀取數據的時候,該階段也會根據presto對查詢執行計劃的優化完成相關的斷言下發和條件過濾等。

 exchange 

exchange的字面意思就是交換,presto的stage是經過exchange來鏈接另外一個stage的,exchange用於完成有上下游關係的stage之間的數據交換,在presto中有兩種exchange:output Buffer和exchange client,生產數據的stage經過名爲output buffer的exchange將數據傳送給其下游的stage。(根據數據的流向,分爲上下游,你能夠將presto中的查詢執行過程當中的數據比喻成一條河流,那麼產生數據的stage對於消費數據的stage來講,就是上游)消費數據的stage經過名爲exchange client的exchange從上游stage讀取數據。 
若是當期的stage是source類型的stage。那麼該stage則是直接經過相應的connector從數據源讀取數據的,而該stage則是經過名爲source operator的operator與connector進行交互的,例如,若是一個source stage直接從HDFS獲取數據,那麼這種操做不是經過exchange client來完成的,而是經過運行於driver中的source operator來完成的。

 task 

從前面的章節咱們能夠知道,stage並不會在presto集羣中實際運行,它僅表明針對於一個SQL語句查詢執行計劃中的一部分查詢的執行過程,只是 用於對查詢執行計劃進行管理和建模,stage在邏輯上又被分爲一系列的task,這些task則是須要實際運行在presto的各個worker節點上的, 
在presto集羣中,一個查詢執行被分解成具備層級關係的一系列的stage。一個stage又被分爲一系列的task,每一個task處理一個或者多個split,每一個task都有相應的輸入和輸出,一個stage被分解成多個task,從而能夠並行的執行一個stage,task也採用了相同的機制,一個task也能夠被分解爲一個或者多個driver,從而並行地執行一個task。

 driver 

一個task包含一個或者多個driver,一個driver其實就是做用於一個split的一系列operator的集合,所以一個driver用於處理一個split,而且生成相應的輸出,這些輸出由task收集而且傳送給其下游stage中的一個task,一個driver擁有一個輸入和一個輸出 

split 

split即分片,一個分片其實就是一個大的數據集中的一個小的子集,而driver則是做用於一個分片上的一系列操做的集合,而每一個節點上運行的task,又包含多個driver,從而一個task能夠處理多個split,其中每一種操做均由一個operator表示,分佈式查詢執行計劃的源stage經過connector從數據源得到多個分片,source stage對split處理完畢以後,會將輸出傳遞給其下游stage, 
當presto執行一個查詢的時候,首先會從coordinator獲得一個表對應的全部split,而後presto就會根據查詢執行計劃,選擇合適的節點運行相應的task處理split 

operator

一個operator 消費、流轉、生產數據。例如,一個表的scan從一個connector讀取數據,而且生產數據被其它operator消費。一個filter operator消費數據,而且返回一個子集。

page 

page是presto中處理的最小數據單元,一個page對象包含多個block對象,而每一個block對象是一個字節數組,存儲一個字段的若干行,多個block橫切的一行的真實的一行數據,一個page最大爲1MB,最多16*1024行數據,

相關文章
相關標籤/搜索