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

93 阅读5分钟

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

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


今天学习了课程《Presto 架构原理与优化介绍》,学习的内容主要分为以下几个部分:

  • Presto基本概述
  • Presto基础原理和概念
  • Presto重要机制
  • 性能优化实战

一、Presto基本概述

1.1 大数据与OLAP的演进

什么是大数据?

在信息化时代背景下,由于信息交互,信息存储,信息处理能力大幅增加而产生的数据。

什么是OLAP?

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

OLAP与MapReduce对比:

  • MapReduce代表了抽象的物理执行模型,使用门槛较高。
  • 与MapReduce Job相比,OLAP引擎常通过SQL的形式,为数据分析、数据开发人员提供统一的逻辑描述语言,实际的物理执行由具体的引擎进行转换和优化。

常见的OLAP引擎:

  • 预计算引擎:Kylin,Druid
  • 批式处理引擎:Hive,Spark
  • 流式处理引擎:Flink
  • 交互式处理引擎:Presto,Clickhouse,Doris

1.2 Presto设计理念

Presto设计思想

Presto最初是由Facebook研发的构建与Hadoop/HDFS系统之上的PB级交互式分析引擎,具有以下特点:

  • 多租户任务的管理与调度
  • 多数据源联邦查询
  • 支持内存化计算
  • Pipeline式数据处理

二、Presto基础原理和概念

2.1 Presto基础概念

  • 服务相关概念

    • Coordinator

      • 解析SQL语句
      • 生成执行计划
      • 分发执行任务给Worker节点
    • Worker

      • 执行Task处理数据

      • 与其他Worker交互传输数据

    image-20220807235820375.png

  • 数据源相关概念

    • Connector

      一个Connector代表一种数据源。可以认为Connector是由Presto提供的适配多数据源的统一接口。

    • Catalog

      管理元信息与实际数据的映射关系。

    image-20220807235851131.png

  • Query相关概念

    • Query:基于SQL parser 后获得的执行计划。
    • Stage:根据是否需要shuffle将Query拆分成不同的subplan,每个subplan便是一个stage
    • Fragment:基本等价于Stage,属于在不同阶段的称呼。
    • Task:单个Worker节点上的最小资源管理单元:在一个Stage只有一个Task,一个Query可能有多个Task。
    • Pipeline:Stage按照LocalExchange切分为若干Operator集合,每个Operator集合定义一个Pipeline。
    • Driver:Pipeline的可执行实体,Pipeline和Driver的关系可类比程序和进程,是最小的执行单元,通过火山迭代模型执行每个Operator。
    • Split:输入数据描述,数量上和Driver一一对应,不仅代表实际数据源split,也代表了不同stage间传输的数据。
    • Operator:最小的物理算子。
  • 数据传输相关概念

    • Exchange

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

      • Stage内的rehash操作。默认值为16。

2.2 Presto核心组件架构介绍

Presto架构图

image-20220808000928665.png

2.2.1 服务发现

Discovery Service:

  1. Worker配置文件配置Discovery Service地址
  2. Worker节点启动后会向Discovery Service注册
  3. Coordinator 从 Discovery Service 获取Worker的地址

image-20220808001202299.png

2.2.2 通信机制

各组件之间的通信机制

  1. Presto Client / JDBC Client 与Server 间通信

    • Http
  2. Coordinator 与 Worker 间通信

    • Thrift / Http
  3. Worker 与 Worker 间通信

    • Thrift / Http

Thrift 与 Http 之间的区别:

Thrift具有更好的数据编码能力,Http 1.1 还不支持头部信息的压缩,Thrift具有更好的数据压缩率。

2.2.3 Presto Worker的不同状态

  • Active
  • InActive
  • Shutdown

三、Presto重要机制

3.1 多租户资源管理

  • Resource Group

    • 类似Yarn多级队列的资源管理方式
    • 基于CPU、MEMORY、SQL执行数进行资源使用量限制
  • 优点

    • 轻量级的Query级别的多级队列资源管理
  • 缺点

    • 存在一定的滞后性,只会对Group中正在运行的SQL进行判断。

3.2 多租户下的任务调度

  • 物理计划生成

    1. Antlr4解析生成 AST
    2. 转化成 Logical Plan
    3. 按照是否存在 Shuffle(Exchange),切分成不同的Stage(Fragment)
  • Stage调度

    • AllAtOnceExecutionPolicy 同时调度,延迟点,会存在任务空跑
    • PhasedExecutionPolicy 分阶段调度,但不代表每个stage都分开调度,有一定延迟节省部分资源
  • Task调度

    • Task的数量如何确定?

      • Source:根据数据meta决定分配多少节点
      • Fixed:哈希分区数确定
      • Sink:汇聚结果,一台机器
      • Scaled:无分区限制,可扩展,如write数据
      • Coordinator——Only:只需要coordinator参与
    • 选择什么节点

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

    • 调度方式

      • FIFO:顺序执行,绝对公平
      • 优先级调度:快速响应

四、个人总结与思考

通过本次课程,掌握了Presto相关概念与基本原理,其中对Presto的基础架构组件理解较为透彻,而对Presto的多租户下的任务调度的具体流程还不能够很深刻地理解。Presto是一个分布式的开源SQL查询引擎,用于运行交互式分析查询。Presto在BI类型查询中处于领先地位,与主要用于性能丰富查询的Spark不同,Presto对并发查询工作负载的支持至关重要。因此从并发查询执行和增加的工作量的角度出发,我们可以使用它。

\