Presto架构与优化|青训营笔记

129 阅读4分钟

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

本次笔记重点内容

  1. 介绍 OLAP 的演进之路、Presto 的设计理念
  2. 介绍 Presto 的基础概念与原理
  3. 对 Presto 的特色和重要机制进行讲解和剖析
  4. 介绍 Presto 常用的优化工具以及在字节内部的相关优化

OLAP

大数据分析引擎,对业务数据执行多维分析,提供复杂计算、趋势分析和复杂数据建模能力

OLAP VS MapReduce

MapReduce使用门槛较高,OLAP引擎通过SQL为数据分析和开发人员提供了统一的逻辑描述语言

核心概念——维度 & 度量
常见OLAP引擎
  • 预计算引擎,Kylin、Druid
  • 批式处理引擎,Spark、Hive
  • 流式处理引擎,Flink
  • 交互式处理引擎,重点在于对用户体验做实时分析,用户能多快查出结果,解决延迟问题

Presto

建于Hadoop(基于廉价机器的存算分离的大规模分布式处理系统)/HDFS系统上的PB级交互式分析引擎,支持内存化计算和Pipeline式数据处理(流式)

基础概念与原理
  • 服务相关

image.png

Presto服务就是红色框内,Coordinator做调度和SQL解析,Worker做实际处理,当客户端提交一个查询的时候,coordinator会从当前存活的worker中选择出适合的worker节点去运行task

  • 数据源相关

image.png

Connector就是Presto提供的可以适配多数据源的统一接口,一个Connector代表一种数据源,Catalog管理元数据与实际数据的映射关系

  • Query相关

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

Stage=Fragment(不同阶段的称呼不同)

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

Task

单个 Worker 节点上的最小资源管理单元。在一个节点上, 一个 Stage 只有一个 Task, 一个 Query 可能有多个Task

Pipeline

Stage 按照 LocalExchange(等价于在stage内部进行数据rehash--Shuffle操作) 切分为若干 Operator 集合, 每个 Operator 集合定义一个 Pipeline

Driver

Pipeline 的可执行实体 , 去执行不同的operator,Pipeline 和 Driver 的关系可类比程序和进程,是最小的执行单元

Presto 架构图

image.png

Presto 重要机制

多租户资源管理——Resource Group 资源组

对不同的用户创建不同Group从而实现不同租户、不同场景的资源管理,基于真实信息自动生成队列,是轻量的Query级别的多级队列资源管理模式,但存在一定滞后性,只能对group中正在运行或在排队的SQL进行判断

多租户下的任务调度

  • Stage调度
    • AllAtOnceExecutionPolicy 同时调度(默认) 把所有Stage的Task启动起来,上游一边分析一边把处理好的部分数据发到下游同时处理,让内存计算比较可行,时效性高,延迟低。但会存在任务空跑。
    • PhasedExecutionPolicy 分阶段调度 不代表每个Stage都分开调度。允许右表先调度一个Task进行哈希构建,再让左表进行探测和扫描。有一定延迟,但会节省部分资源。
  • Task调度——会根据数据决定分配多少节点,那选择什么样的节点呢?
    • HARD_AFFINITY 计算、存储 Local 模式,保障计算与存储在同一个节点,减少数据传输
    • SOFT_AFFINITY 基于某些特定算法,如一致性HASH函数,常用于缓存场景,保证相似的 Task 调度到同一个 Worker
    • NO_PREFERENCE 随机选取,常用于普通的纯计算 Task
  • Split调度

存在优先级调度,实现快速响应,优先保证小Query快速执行,也保障大Query按一定时间比例来执行

内存计算

Pipeline化数据处理

更好实现算子间的并行

Back pressure mechanism

控制源头split产生速度也控制Operator执行速度

多数据源联邦查询

将各个数据源进行统一管理,由presto server进行统一的物理执行,但元数据管理和映射很麻烦,每个数据源都需要单独的一套catalog管理,谓词下推也不好做,还有如何对数据源进行分片。

性能优化实战
  • Grafana,时序化的数据展示
  • java相关指令——Jstack、JMX、JMAP
  • Flame Figure 火焰图