Presto学习之路 -- 01.整体介绍

介绍

Presto是一个分布式SQL查询引擎,用于查询分布在一个或多个不同数据源中的大数据集。完整安装包括一个Coordinator和多个Worker。 由客户端提交查询,从Presto命令行CLI提交到Coordinator。 Coordinator进行解析,分析并执行查询计划,然后分发处理队列到Worker。

Presto是完全基于内存的分布式大数据查询引擎,所有查询和计算都在内存中执行。

Presto的输入是SQL语句;输出是具体的SQL执行结果。

Presto可以对接不同的数据源,例如MySQL、Hive等。

Presto可以对SQL的查询过程进行优化,包括SQL本身的执行计划优化,以及用分布式查询提高并发等。

Presto不是数据库,并不能处理在线事务。

基本概念

进程类型

Coordinator

  • 作用:
    • 对外负责管理集群与客户端的连接,并接收客户端查询请求。
    • 进行SQL的语法解析、查询计划生成和优化,并进行查询任务的调度。
    • 集群的管理节点。内置了discovery server,跟踪Worker节点的状态。
  • 部署情况:一般作为单独节点部署在集群中;如测试需求,可以与Worker共节点部署一个节点。
  • 通信方式:使用RESTful接口与客户端、Workers进行交互。

Worker

  • 作用:集群的工作节点。用于执行被分解后的查询任务(task)及处理数据。
  • 部署情况:一般集群中部署多个worker节点。
  • 通信方式:使用RESTful接口与Coordinator、其他Workers进行交互。

交互关系

  • 状态管理:
    • Workers每隔一段时间会向Coordinator发送RESTful心跳,告知Coordinator的discovery server自己还活着。
  • 数据处理:
    • Workers:负责从connectors拉取数据,并与其他Workers进行中间数据的交互处理。
    • Coordinator:负责从Workers拉取结果,并将最终结果返回给客户端。
    • Coordinator接收到客户端查询后,从存活的Workers列表中选出合适的Workers进行运行Task。

数据源

Connector

作用:Presto通过connector可以访问多种不同的数据源。connector相当于数据库访问的驱动。

  • 每种connector通过实现Presto的SPI接口实现数据源的标准接入。
  • 如何通过connector访问数据源?
    • 在$PRESTO_HOME/etc/catalog/下创建配置文件:example.properties。(后缀必须为properties)
    • 设置属性connector.name,必选属性。catalog manager通过该配置属性创建访问相应数据源的connector。
    • 支持使用多个catalog使用相同的connector去访问两个相似的数据源。例如,可以在一个presto集群中配置两个catalog(都是用Hive connector),用于访问两个Hive集群。

Catalog

Catalog可以包含多个schema,并且通过使用指定的connector访问指定的数据源。例如,通过配置Hive catalog来访问Hive数据源。

Schema

作用:用于管理表,类似于Mysql中的database。一个catalog及一个schema可以唯一确定一组可查询的表集合。

Table

与传统关系数据库的概念类似。从数据源到表达映射由connector指定。

相互关系

当访问数据表时,表的全名以Catalog(即catalog配置的前缀,例如xxx.properties中的xxx的具体取值)开头。例如,hive.test_data_schema.test所指定的是位于test_data_schema schema中test表,而test_data_schemaschema则位于hive catalog中。

查询执行模型

Presto在执行SQL statement时,会将这些statment解析成对应的queries,然后在分布式集群中执行查询。

Statement

Presto支持ANSI标准的SQL语句,这些语句包括子句(caluses)、表达式(expressions)、断言(predicates)组成。

Presto为什么要区分statement和query点概念呢?在Presto中,statesments指的是用户输入的SQL语句的文本表示。当statement被执行时,Presto会创建查询执行及查询计划用于执行相应query,而查询计划是在一系列Worker节点上分布式执行的。【This is necessary because, in Presto, statements simply refer to the textual representation of a SQL statement. When a statement is executed, Presto creates a query along with a query plan that is then distributed across a series of Presto workers.】

Query

当Presto接收到一个SQL语句(statement),会将其转换为一个查询执行(Query),同时创建查询计划(query plan)。其中,查询计划是运行在Prestor Workers上的一系列相关联的stages。【When Presto parses a statement, it converts it into a query and creates a distributed query plan which is then realized as a series of interconnected stages running on Presto workers. When you retrieve information about a query in Presto, you receive a snapshot of every component that is involved in producing a result set in response to a statement.】

Statement 与 Query的差别:Statement是输入给Presto的SQL文本;Query是用于为了执行Statement而实例化出来的一些列配置及组件。一个Query包含stages、tasks、splits、connectors等组件和相应的数据源这些概念。【A statement can be thought of as the SQL text that is passed to Presto, while a query refers to the configuration and components instantiated to execute that statement. A query encompasses stages, tasks, splits, connectors, and other components and data sources working in concert to produce a result.】

Stage

当Presto执行Query时,会将query拆分成具有层次关系的多个stages。例如,Presto从Hive中查询1亿条记录并进行数据聚合时,Presto会创建一系列的stages用于执行相应的分布式查询,同时创建一个root stage用于聚合上述stages的查询输出,之后将结果聚合后输出给Coordinator,并进一步输出给用户。

一个Query的stages之间是树形的层次结构。每一个Query都有一个Root stage,用于聚合所有其他Stages的输出数据。Stage只是coordinator用于分布式查询计划(query plan)建模的逻辑概念,本身并不会执行在Presto Workers上。

Task

前文提到Stage并不会在Presto Workers上直接运行,他们是通过分解成一系列运行在Presto Worker上的task任务运行的。

Presto是通过Task来运行的。

  • 一个分布式查询计划(query plan)被拆解成一些列的stage。
  • 一个stage分解成一系列并行执行的task。
  • 每个task被分解成一个或多个并行的driver,每个driver作用于一个splist上。这样,每个task可以并行处理一个或多个split。每个task都有对应的输入输出。

Split

一个split是整个大的数据集上的一个小的切片。位于分布式query plan中较低层次的stages从数据源获取splits,位于较高层次的中间stages则从其他stages取数据。

当Presto执行一个Query时,Coordinator会询问一个connector获取一张表所有的split列表。然后,Coordinator会选择合适的节点运行对应的task来处理split。【When Presto is scheduling a query, the coordinator will query a connector for a list of all splits that are available for a table. The coordinator keeps track of which machines are running which tasks and what splits are being processed by which tasks.】

Driver

一个Task包含一个或多个driver。Drivers处理数据,并由task聚合后传给下游stage的一个task。一个Driver就是作用于一个split上的一系列operator的集合。

Driver是Presto架构最底层的并行处理单元。

每个driver都有一个输入和一个输出。

【Tasks contain one or more parallel drivers. Drivers act upon data and combine operators to produce output that is then aggregated by a task and then delivered to another task in another stage. A driver is a sequence of operator instances, or you can think of a driver as a physical set of operators in memory. It is the lowest level of parallelism in the Presto architecture. A driver has one input and one output.】

Operator

一个Operator代码对于一个Split的一种操作。一个Operator依次读取一个Split中的数据,将Operator所代表的计算和操作应用于该split上,并产生输出。

Exchange

Exchange用于不同Presto节点间的数据交换。Task生产数据放入输出缓存中,也可以通过exchange客户端从其他task消费数据。

关系

  • 1个Query <-> 多个Stages
  • 1个Stage <-> 多个并行的Tasks
  • 1个Task <-> 多个Drivers
  • 1个Driver <-> 1个Split
  • 1个Driver <-> 一些列Operators

整体架构

  • Coordinator:1个。可靠性如何保证?
  • Worker:多个
  • CLI:部署Presto命令行客户端的服务器。
  • 应用程序客户端:使用Presto JDBC驱动的程序。

猜你喜欢

转载自blog.csdn.net/TangYuG/article/details/132756315
01.