1、Coordinator所有工作都是其上StatementResource类提供的RESTful服务生成的。
2、Worker服务进程每隔一定时间都会向Coordinator上的RESTful服务发送心跳,告知Coordinator我还活着,并接受你调度。
3、当你需要某种Connector访问特定数据源,需要在$PRESTO_HOME/etc/catalog/中创建.properties配置文件,并配置必要属性:connector.name。
4、Statement:输入的SQL语句,将语句(Statement)和查询(Query)分开,两者本身就是不同概念。
5、Query:一个查询执行代表presto集群中运行的查询,是由运行在各个Worker上且各自之间相互关联的阶段(Stage)组成。
6、一个查询执行由Stage、Task、Driver、Split、Operator和DataSource组成。
7、Stage:presto会将一个Query拆分成具有层级关系的多个Stage,一个Stage就代表查询执行计划的一部分;每个Stage都有个Root Stage,该Stage用于聚集所有其他Stage的输出数据,并将最终数据反馈给客户端;每个Stage都会有输入和输出(除了Single/Root Stage和Source Stage),都会从上游Stage读取数据,将产生结果输出给下游Stage;Source Stage没有上游Stage,从Connector获取数据,Single Stage没有下游Stage,直接将结果输送给Coordinator。
8、Stage分类:Coordinator_Only这种类型Stage用于执行DDL或DML语句中最终表结构创建或者更改;Single这种类型聚合Stage输出数据,并将最终数据输出给终端用户;Fixed用于接受其子Stage产生的数据并在集群中对这些数据进行分布式聚合或分组计算;Source这种用于直接连接数据源,读取数据,该阶段也会根据presto对查询执行计划的优化完成相关断言下发和条件过滤等。
9、Exchange:完成上下游间Stage的数据交换,生成数据的Stage通过名为Output Buffer的Exchange将数据传送给其下游的Stage,消费数据的Stage通过名为Exchange Client的Exchange从上游Stage读取数据;若当前为Source Stage,那该Stage直接通过相应Connector从数据源读取数据,通过名为Source Operator的Operator与Connector进行交互。
10、Task:Stage在逻辑上又被分为一系列Task,真正运行在各个Worker节点上,每个Task处理一个或多个Split;一个Stage被分解为多个Task,并行执行一个Stage,一个Task可以被分解为一个或多个Driver,并行执行一个Task。
11、Driver:一个Task包含一个或多个Drier,一个Driver其实就是作用于一个Split的一系列Operator集合,一个Driver用于处理一个Split并生成输出,这些输出由Task收集并且传送给其下游Stage中的一个Task,一个Driver有一个输入和一个输出。
12、Operator:一个Operator代表对一个Split的一种操作,每个Operator均会以Page为最小处理单位分别读取输入和产生输出数据,Operator每次只会读取一个Page对象,产生一个Page对象。
13、Split:分片,一个分片就是大的数据集中的一个小数据集,而Driver则是作用于一个分片上的一系列操作集合,而每个节点上运行的Task,又包含多个Driver,从而一个Task可以处理多个Split,其中每一种操作均由一个Operator表示;当presto执行一个查询的时候,首先会从Coordinator得到一个表对应的所有Split,然后presto就会根据查询执行计划,选择合适的节点运行相应的Task处理Split。
14、Page:最小数据单元,一个Page包含多个Block,每个Block是一个字节数组,存储一个字段若干行,多个Block横切的一行是真实的一行数据,一个Page最大1MB,最多16×1024行数据。
15、presto执行查询步骤:(1)客户端通过HTTP协议发送一个查询语句给presto集群的Coordinator;(2)Coordinator接到客户端传递过来的查询语句,会对该查询语句进行解析,生成查询执行计划,并根据查询执行计划依次生成SQLQueryExecution、SQLStageExecution、HttpRemoteTask,Coordinator会根据数据本地性生成对应的HttpRemoteTask;(3)Coordinator将每个Task都分发到其所需要处理的数据所在Worker上进行执行,这个过程是通过HttpRemoteTask中的HttpClient将创建或者更新Task的请求发送给数据所在节点上TaskResource所提供的RESTful接口,TaskResource接收到请求之后最终会在对应的Worker上启动一个SqlTaskExecution对象或者更新对应的SqlTaskExecution对象需要处理的Split;(4)执行处于上游Source Stage中的Task,这些Task通过Connector从数据源中读取所需要的数据;(5)处于下游Stage的Task会读取上游Stage产生的输出结果,并在该Stage每个Task所在Worker的内存中进行后续的计算和处理;(6)Coordinator从分发Task之后,就会一直持续不断地从Single Stage中的Task获取计算结果,并将结果缓存到Buffer中,直到所有计算结束;(7)Client从提交查询语句之后,就会不停地从Coordinator中获取本次查询的计算结果,直到获得了所有的计算结果,并不是等到所有的查询结果都产生完毕之后一次全部显示出来,而是每产生一部分,直到所有的查询结果都显示完毕。