presto架构和概念介绍

presto 介绍

  Presto是大数据场景中常用的查询引擎,其采用master- slave架构,支持跨数据源类型查询,支持动态横向扩展,采用了内存并行处理、跨集群节点管线执行、多线程执行模型、高效的扁平内存数据结构、Java字节码生成等技术,来完成分布式数据查询和处理。现已广泛应用于OLAP场景。

一、presto简介

  Presto是facebook开源的分布式SQL查询引擎,本身并不提供存储,不是数据库,而是通过connector去连接对应的数据库,完成数据查询和计算。其完全基于内存计算,适用于交互式分析查询。其有两个分支:PrestoSQL(Trino)和PrestoDB,两者是由不同的团队维护,在数据库类型的支持上有所差别,基本功能是类似的。

  前文说到,presto是完全基于内存计算的,其生来就是用来处理大数据量的,并带来极大的性能提升,在Facebook和京东的测试中,Presto的查询性能比hive提高5-10倍,尤其适合OLAP场景,期望快速返回结果的实时分析。

1.1 Presto 硬件架构

  Presto是master- slave架构的,由一个Coordinator节点,一个Discovery 节点,和多个Worker节点组成,如图1所示:
presto架构和概念介绍_第1张图片

  • Coordinator(协调器): 负责解析SQL语句,生成执行计划,分发执行任务给Worker节点执行。
  • Discovery(发现服务): 通常内嵌于Coordinator节点中。
  • Worker(工作节点): 负责实际执行查询任务,从对应数据库中读取数据;Worker启动后向;
  • Discovery Server服务注册,Coordinator从Discovery Server获得可以正常工作的Worker节点。
      master- slave客户端、协调器和工作节点之间的通信和数据传输完全通过http/https的Restful Api调用。协调器是整个presto集群的大脑,用户可以通过Presto CLI、JDBC或者ODBC驱动连接协调器,进行sql的交互。

1.2 Presto模型

1.2.1 Connector

  Presto可以通过不同类型的Connector访问多种数据源,目前(以trino-380为例)支持的Connector有:Accumulo、Blackhole、Cassandra、Clickhouse、Delta-Lake、Druid、Elasticsearch、Geospatial、Google-Sheets、Hive、Iceberg、Jmx、Kafka、Kinesis、Kudu、Mariadb、Memory、ML、Mongodb、Mysql、Oracle、Phoenix、Point、Postgresql、Prometheus、Raptor、Redis、Redshift、Singlestore、Sqlserver、Teradata、Tpc-Ds、Tpch。

  可以将Connector当作Presto访问不同数据源的驱动程序,每种Connector都实现了Presto中标准的SPI接口,也即只要实现了Presto中标准的SPI接口,就可以轻易实现适合自己需求的Connector。

1.2.2 Catalog

  Presto中的Catalog,相当于数据库的一个实例。在Presto的配置文件中,以.properties结尾,每个properties就对应了Presto中的一个Catalog。

1.2.3 Schema

  Presto中的Schema,类似于mysql中的Database,一个Catalog中可以有多个Schema。

1.2.4 Table

  Presto表,与数据库中的表的含义一致,都指向具体的物理存在的表。

1.3 Presto执行过程

presto架构和概念介绍_第2张图片
  SQL语句首先以文本形式提交到协调器,协调器解析该SQL,之后创建Presto的内部数据结构,称之为查询计划。查询计划生成过程中,用到了元数据的SPI和数据统计的SPI来创建查询计划。元数据的SPI获取表、字段和数据类型的信息,用于对查询进行语义校验、类型检查和安全检查,数据统计SPI用于获取数据行数和表大小信息,可以进行基于代价的查询优化。在创建分布式查询任务时,会用到数据位置SPI来生成表内容的逻辑切片,切片是任务分配和并行的最小单位。

  协调器将查询计划切分成Stage,Stage是在运行时的计划片段,它包含对应计划片段所描述的所有任务,每个任务负责处理一小部分数据;一个任务处理数据的单位是切片,切片代表一个工作节点抽取并处理的一段底层数据,连接器所执行的的特定数据取决于连接器对应的具体的数据源类型。任务分配给集群中的多个工作节点进行并行处理,从而加快整个查询的执行速度。

  Stage的任务以Page形式产生数据,每个Page中以列式存储的方式,存储了多个维度的字段数据,Page传输到下游的中间Stage,Exchange算子从Stage中读取数据,并在不同阶段的Stage中传输Page。

  通过连接器,源任务使用数据源的SPI从底层数据源获取数据,并以Page形式在Presto的Worker和Coordinator传递。算子根据其具体的逻辑语义处理Page中的数据,并生成新的Page,如Filter算子会过滤掉不符合条件的数据,窗口函数算子会对数据进行计算。包含在一个任务里的一连串算子称为流水线,最后一个算子将要输出的数据,放入数据缓冲区。下游的Exchange算子会消费上游任务输出缓冲区的Page。如下图:
presto架构和概念介绍_第3张图片
  任务是运行时分配给工作节点的计划片段,任务创建后,会为每个切片初始化一个驱动。每个驱动是包含多个算子的流水线的实例,并用来处理切片中的数据。也即,将底层数据源中查询到的数据作为流水线的输入,经过各算子处理后的数据作为流水线的输出。当工作节点将所有的切片处理完成后,就代表了数据完成了处理,协调器将最后的结果返回给用户。

参考:《Presto实战》

你可能感兴趣的:(presto,数据库,java,big,data)