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

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

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


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


参考链接:

1.【大数据专场 学习资料三】第四届字节跳动青训营


前言


BigData简介

OLAP介绍-维基百科

MapReduce vs OLAP

MapReduce代表了抽象的物理执行模型,使用]槛较高。

与Mapreduce Job相比,OLAP引擎常通过SQL的形式,为数据分析、数据开发人员提供统的逻辑描述语言,实际的物理执行由具体的引|擎进行转换和优化。

维度:

1.png

\

常见的OLAP引擎:

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


Presto 基础概念


服务

  • Coordinator(负责调度):
  • 解析SQL语句
  • ⽣成执⾏计划
  • 分发执⾏任务给Worker节点执⾏
  • Worker

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


  • Discovery Service(将coordinator和woker结合到一起的服务):
  • Worker节点启动后向Discovery Server服务注册
  • Coordinator从Discovery Server获得Worker节点

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

1.png

数据源


  • Connector

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

  • Catalog

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


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

1.png

  • Split

输入数据描述(数据实体是 Page), 数量上和 Driver 一一对应,不仅代表实际数据源split,也代表了不同stage间传输的数据

  • Operator

最小的物理算子


数据传输部分


  • Exchange

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

  • LocalExchange (默认数值是16)

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

1.png

\

如何衡量某个任务某个Stage的真实并行度?

在不同Pipeline下Split (Driver)的数目之和。

Coordinator与Worker是如何协调和I作的?


1.服务发现

discovery service

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


2.通信机制

  1. Presto Client I JDBC Client与Server间通信 (Http)
  2. Coordinator与Worker间的通信 (Thrift/ Http)
  3. Worker与Worker间的通信 ( Thrift / Http)

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


3.结点状态

Presto Worker的不同状态

  1. Active
  2. InActive
  3. Shutdown

shutdown状态的作用?

  • Graceful Shutdown (优雅的扩容)

https:/trino.io/docs/current/admin/graceful-shutdown.html


Presto设计理念

1.png

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

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

\

Presto架构图:

1.png

\


重要机制


多租户资源管理

情景假设:

用户zhangyanbingPresto-cli提交一个sql,sql语句如下:

select customer_type, avg(cost) as a 
from test_table 
group by customer_type 
order by a limit 10;

Resource Group

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

Presto用户多租户隔离的手段:

Presto 通过Resource Group对不同的用户创建不同Group从而实现不同租户,不同场景的资源管理

\

Presto Resource Group的优缺点

优点:支持通配符的形式,对不同租户,不同提交场景下的用户进行限制

缺点:资源的管理和判断是以当前用户正在运行的SQL资源使用量为基准,对于低频大SQL场景不太适用


多租户任务调度


物理计划生成:

  1. Antlr4 解析生成AST

2.转换成Logical Plan

3.按照是否存在Shuffle (Exchange) ,切分成不同的Stage (Fragment)

1.png

Presto是从哪几个方面实现了多租户的任务调度

  1. Stage调度策略
  2. Task的节点选择策略
  3. Split调度策略


Stage调度策略


Presto Stage调度的方式:

  • AllAtOnceExecutionPolicy (同时调度)

延迟低,会存在任务空跑

  • PhasedExecutionPolicy (分阶段调度)

有一定延迟,节省部分资源

典型应用(join查询)

  • Build端:右表构建用户join的hashtable
  • Probe端:对用户左表数据进行探查,需要等待build端完成
  • Build端构建hashtable端时,probe 端是一-直在空跑的

1.png

Task的节点选择策略

Presto Task 调度的方式


Task数量的确定:

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

选择什么样的的结点:

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

Split调度策略

FIFO:顺序执行

优先级调度:快速响应

1.按照固定的时间片,轮训Split 处理数据,处理1s,再重新选择一-个Sp it执行

  1. Split 间存在优先级

MultilevelSplitQueue

5个优先级level理论上分配的时间占比为16:8:4:2:1 (2-based)


优势:

1.优先保证小Query快速执行

2.保障大Query存在固定比例的时间片,不会被完全饿死

内存计算

Pipeline ( 按Localexchange拆分 )

pipeline的引入更好实现了算子间的并行;

语义上保证了每个task内的数据流式处理。


Presto是如何实现Back pressure mechanism的

  1. 控制split生成流程
  2. 控制Operator执行速度


1.targetConcurrency auto-scale out

针对每个Task定时检查, 如果 OutputBuffers 使用率低于 0.5 (下游消费较快, 需要提高生产速度), Split 并发度+1

2."sink.max-buffer-size" 写入buffer的大小控制


"exchange.max-buffer-size" 读取buffer的大小控制,Buffer 达到最大值时Operator会进入阻塞状态


多数据联邦查询


1.png

Presto多数据源支持的优点与缺点


优点:支持多数据源的联邦查询


缺点:针对不同数据源,还存在许多问题需要解决

  • 谓词下推
  • 每个数据源都需要单独的一套catalog管理
  • 数据源分片


性能优化


常用的性能分析工具:

  • Grafana
  • Arthas
  • Watch
  • Trace
  • Flame Figure(火焰图)
  • java指令:jstack等指令
相关文章
|
1天前
|
监控
SMoA: 基于稀疏混合架构的大语言模型协同优化框架
通过引入稀疏化和角色多样性,SMoA为大语言模型多代理系统的发展开辟了新的方向。
13 6
SMoA: 基于稀疏混合架构的大语言模型协同优化框架
|
3天前
|
XML 前端开发 Android开发
Kotlin教程笔记(80) - MVVM架构设计
Kotlin教程笔记(80) - MVVM架构设计
|
10天前
|
开发者 容器
Flutter&鸿蒙next 布局架构原理详解
本文详细介绍了 Flutter 中的主要布局方式,包括 Row、Column、Stack、Container、ListView 和 GridView 等布局组件的架构原理及使用场景。通过了解这些布局 Widget 的基本概念、关键属性和布局原理,开发者可以更高效地构建复杂的用户界面。此外,文章还提供了布局优化技巧,帮助提升应用性能。
72 4
|
8天前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
36 1
|
10天前
|
存储 Dart 前端开发
flutter鸿蒙版本mvvm架构思想原理
在Flutter中实现MVVM架构,旨在将UI与业务逻辑分离,提升代码可维护性和可读性。本文介绍了MVVM的整体架构,包括Model、View和ViewModel的职责,以及各文件的详细实现。通过`main.dart`、`CounterViewModel.dart`、`MyHomePage.dart`和`Model.dart`的具体代码,展示了如何使用Provider进行状态管理,实现数据绑定和响应式设计。MVVM架构的分离关注点、数据绑定和可维护性特点,使得开发更加高效和整洁。
145 3
|
18天前
|
监控 API 开发者
后端开发中的微服务架构实践与优化
【10月更文挑战第17天】 本文深入探讨了微服务架构在后端开发中的应用及其优化策略。通过分析微服务的核心理念、设计原则及实际案例,揭示了如何构建高效、可扩展的微服务系统。文章强调了微服务架构对于提升系统灵活性、降低耦合度的重要性,并提供了实用的优化建议,帮助开发者更好地应对复杂业务场景下的挑战。
17 7
|
16天前
|
XML 前端开发 Android开发
Kotlin教程笔记(80) - MVVM架构设计
Kotlin教程笔记(80) - MVVM架构设计
23 1
|
17天前
|
存储 Kubernetes 监控
深度解析Kubernetes在微服务架构中的应用与优化
【10月更文挑战第18天】深度解析Kubernetes在微服务架构中的应用与优化
73 0
|
7天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
4天前
|
监控 安全 应用服务中间件
微服务架构下的API网关设计策略与实践####
本文深入探讨了在微服务架构下,API网关作为系统统一入口点的设计策略、实现细节及其在实际应用中的最佳实践。不同于传统的摘要概述,本部分将直接以一段精简的代码示例作为引子,展示一个基于NGINX的简单API网关配置片段,随后引出文章的核心内容,旨在通过具体实例激发读者兴趣,快速理解API网关在微服务架构中的关键作用及实现方式。 ```nginx server { listen 80; server_name api.example.com; location / { proxy_pass http://backend_service:5000;