大数据交互式计算引擎---Presto框架 | 青训营笔记

400 阅读5分钟

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

本篇笔记我们主要论述Presto框架,研究它可以让我们深入理解 SQL Parser 、 常见算子的实现(如SQL中table scan,join,aggregation)、资源管理与调度、查询优化(如向量优化、动态代码生成)等。

Presto简介

Presto是一款Facebook开源的MPP架构的OLAP查询引擎,可针对不同数据源执行大容量数据集的一款分布式SQL执行引擎。

Presto是一种基于内存的并行计算,支持任意的数据源,数据规模是GB~PB级别,而且是一种Massively parallel processing(mpp)(大规模并行处理)模型。数据规模PB级并不是指将PB级数据放入内存中,而是在计算时拿出一部分数据放在内存中,然后再计算、抛出,再拿出。

OLAP简介

OLAP  (OnLine Analytical Processing)  对业务数据执行多维分析,并提供复杂计算,趋势分析和复杂数据建模的能力。是许多商务智能(BI)应用程序背后的技术。现如今OLAP已经发展为基于数据库通过SQL对外提供分析能力。

Presto的基础概念

下面简要从 Presto的架构(服务)基本概念 上介绍 Presto。

Presto基础架构

image.png

Coordinator节点 (负责调度)负责接受客户端请求、解析SQL语句、生成并优化分布式逻辑执行计划、将计划中的任务调度到Worker节点上,并跟踪Worker节点和任务的执行状态。

Worker节点  负责任务的执行,接受Coordinator节点的调度。

Presto集群包含1个Coordinator节点和多个Worker节点。 Coordionator节点是管理节点,worker节点 是工作节点。在每个 worker节点 上都会存在一个 worker服务 进程,该服务进程主要进行数据的处理以及 task 的执行,worker服务进程每隔一定的时间都会向Coordinator节点 上的服务发送心跳,接受调度。当客户端提交一个查询的时候,Coordinator节点 则会从当前存活的 worker节点列表 中选择出适合的 worker节点 去运行 task,而 worker节点 在执行每个 task 的时候又会进一步对当前 task 读入的每个 split 进行一系列的操作和处理

另外图上并没有标明Presto的另一个服务,那就是 Discovery Service(将coordinator和woker结合到一起的服务)

  • Worker节点 启动后向 Discovery Server服务 注册
  • Coordinator 从 Discovery Server 获得 Worker节点

所有的worker节点都将自己注册到Discovery Server上,Discovery Server是一个发现服务的service,Discovery Server发现服务之后,coordinator节点便知道在集群中有多少个worker节点能够工作,分配工作到worker节点时便有了依据。

Presto基础概念

Presto中使用到的技术名词主要有以下几种,对于此部分概念我们应熟知,这样实操时才能更加理解每一步的作用。

Presto基础概念-数据源

  • Connector
    Presto通过Connector来支持多数据源,一个Connector代表一种数据源,如 Hive Connector 代表了对 Hive数据源的支持。可以认为 Connector 是由 Presto 提供的适配多数据源的统一接口

  • Catalog
    针对不同的数据源,Connector 和 Catalog 是一一对应的关系,Catalog 包含了 schema 和 data source 的映射关系

Presto基础概念-Query部分

  • Query
    基于 SQL parser 后获得的执行计划

  • Stage
    根据是否需要 shuffle 将 Query 拆分成不同的 subplan,每一个 subpla 便是一个 stage

  • Fragment
    基本等价于 Stage,属于在不同阶段的称呼

  • Task
    单个 Worker 节点上的最小资源管理单元: 在一个节点上, 一个 Stage 只有一个 Task, 一个 Query 可能有多个 Task。在Presto架构中,task是“work horse”。因为分布式查询计划被分解为一系列stage,然后被转换为task,这些task随后执行或被进一步split。一个task有输入和输出,就像一个stage可以有一系列的tasks并行执行一样,一个task可以由一系列的drivers并行执行。

  • Pipeline
    Stage 按照 LocalExchange 切分为若干 Operator 集合, 每个 Operator 集合定义一个 Pipeline

  • Driver
    Pipeline 的可执行实体 , Pipeline 和 Driver 的关系可类比 程序和进程 ,是最小的执行单元,通过 火山迭代模型执行每一个 Operator

  • Split
    Split是较大数据集的一个分片,分布式查询计划的最低级别是stage。因此它是输入数据的描述(数据实体是 Page), 数量上和 Driver 一一对应,不仅代表实际数据源 split ,也代表了不同stage 间传输的数据

  • Operator
    最小的物理算子

Presto基础概念-数据传输部分

  • Exchange
    表示不同 Stage 间的数据传输,大多数意义下等价于 Shuffle

  • LocalExchange
    Stage 内的 rehash 操作,常用于提高并行处理数据的能力(Task 在 presto 中只是最小的容器,而不是最小的执行单元)

Presto的低延迟

  • 本地化计算
  • 流水式计算作业
  • 基于内存的并行计算
  • 动态编译执行计划
  • GC控制

Presto容错

  • 如果某个 worker节点 挂了,discovery service 会通知 Coordinator节点
  • 对于query是没有容错的,一旦 worker节点 挂了,query 就执行失败了,此时需要重新执行
  • Coordinator节点 和 discovery service 的单点故障问题目前还没有解决