Presto 架构原理与优化介绍 | 青训营笔记

267 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第10天

Presto基础概念

  • Presto整体架构

image.png

服务相关

与服务相关的主要有2个节点,一个做调度体系,另一个完成SQL语句的处理

  • Coordinator
    • 它主要有3个作用,解析SQL语句,生成执行计划,分发执行任务给Worker节点。
  • Worker
    • 执行Task处理数据,与其他Worker交互传输数据。

数据源相关

  • Connector
    • Presto是一个多数据源引擎,可以外接多个不同的存储引擎,如HDFS,Cassandra等,Connector就相当于处理这些存储引擎的统一接口,如图中的Hive Connector,每一个Connector都会对应一个真实的数据源。
  • Catalog
    • 管理元信息与实际数据的映射关系,以Hive为例,哪一个目录对应哪一张表格的哪个分区,就是Catalog的内容。

Query相关

  • Query
    • 基于SQL parser 后获得的执行计划
  • Stage
    • 根据需要将Query拆分成多个子计划subplan,每一个subplan就对应一个Stage
  • Fragement
    • Stage阶段的不同称呼
  • Task
    • Worker节点上的最小管理单元,一个Stage只能有一个Task,一个Query可以有多个Task

每个Stage又可以通过LocalExchange切分成多个Operator集合,如下:

image.png

  • Operator
    • 最小的物理算子,如图中LimitOperator
  • Pipeline
    • Operator集合就是一个Pipeline
  • Driver
    • Pipeline的可执行实体,是最小的执行单元
  • Split
    • 输入数据描述,与Driver一一对应,也代表不同Stage中传输的数据

数据传输相关

  • Exchange
    • 表示不同Stage中的数据传输,大多数情况下相当与Shuffle
  • Localexchange
    • Stage中的rehash操作,常用于提高并行数据的处理能力,就相当于程序启动一个线程的操作,默认数值是16。

可以看到我们将一个Task不断细分,如果我们要衡量某个任务某个Stage的真实并行度的话,可以计算在不同Pipeline下Split(Driver)的数目之和。

核心组价架构介绍

Presto架构图的细节:

image.png

对于分布式组件而言,一个分布式系统的关键是:如何有效的调度我们的资源,即这个服务是怎么做到被发现的,以及多个服务之间的一致性协调。

服务发现

实现服务发现主要使用了Discovery Service来完成:

  • Discovery Service:
    • Worker配置文件中包含Discovery Service地址,每个Worker节点启动后会向Discovery Service注册,将它们的地址保存在Service,Coordiantor再从Discovery Service中获取Worker节点的信息。

通讯机制

Presto中通信使用了2种协议,分别是Http和Thrift,由于Http协议比较繁杂,我们在内部节点之间传递数据有时并不需要那么多的头部信息之类,为了提高数据传输效率就使用了Thrift,它具有更好的数据编码能力,以及数据压缩率。
不同节点之间使用的协议:

  1. Presto Clinet / JDBC Client与Server:Http
  2. Coordiantor与Worker:Http / Thrift
  3. Worker与Worker:Http / Thrift
  • 节点的三种状态
    • ACTIVE
    • INACTIVE
    • SHUDOWN

我们来看一下SHUDOWN状态,在Woker节点要关闭它的服务时,不能自己就停止服务,需要设置SHUDOWN状态,Coordiantor发现后就会设置定时时间,让Worker内的Task尽可能的完成,时间结束后就关闭这个节点。

Presto重要机制

多租户任务调度

stage调度

两个策略:

  • AllAtOnceExecutionPolicy
    • 同时调度,存在延迟,任务可能会空跑,默认是同时调度
  • PhasedExecutionPolicy
    • 分阶段调度,有一定延迟、节省部分资源。

Task调度

Task是最小的资源管理单位,它的数量主要靠以下内容确定:

  • source
    • 根据数据meta决定分配多少个节点
  • Fixed:
    • hash partition count确定,如集群节点数量
  • Sink:
    • 汇聚结果到一台机器,再进行一次筛选
  • Scaled:
    • 无分区限制,可拓展,如write数据
  • Coordinator_Only:
    • 只需要coordinator参与

选择什么样的节点:

  • HARD_AFFINITY
    • 计算、存储Local模式,保障计算与存储在同一个节点,减少数据传输
  • SOFT_AFFINITY
    • 基于某些特定算法,如一致性HASH函数,常用于缓存场景,保证相似的Task调度到同一个Worker
  • NO_ PREFERENCE
    • 随机选取,常用于普通的纯计算TaskWorker

Split调度

处理多个SQL语句时,可能会有资源占用大的SQL语句,在这段时间可能会有耗时较短的SQL语句,我们就会想能不能将它提前执行,Split调度就负责完成这个任务。

它按照固定时间片,轮训Split处理数据,处理1s,再重新选一个Split执行,且Split之间存在优先级,像小SQL语句的Split的优先级就比较高。这样做既能提前处理小SQL语句,又能防止大SQL语句被饿死(一直被提前)。

多数据源联邦管理

image.png 将各个数据源进行统一的抽象,最后由Presto Server进行统一的物理执行。