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等指令
相关文章
|
7天前
|
SQL Java 数据库连接
Mybatis架构原理和机制,图文详解版,超详细!
MyBatis 是 Java 生态中非常著名的一款 ORM 框架,在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。本文详细解析了MyBatis的架构原理与机制,帮助读者全面提升对MyBatis的理解和应用能力。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Mybatis架构原理和机制,图文详解版,超详细!
|
12天前
|
监控
SMoA: 基于稀疏混合架构的大语言模型协同优化框架
通过引入稀疏化和角色多样性,SMoA为大语言模型多代理系统的发展开辟了新的方向。
27 6
SMoA: 基于稀疏混合架构的大语言模型协同优化框架
|
10天前
|
存储 NoSQL 分布式数据库
微服务架构下的数据库设计与优化策略####
本文深入探讨了在微服务架构下,如何进行高效的数据库设计与优化,以确保系统的可扩展性、低延迟与高并发处理能力。不同于传统单一数据库模式,微服务架构要求更细粒度的服务划分,这对数据库设计提出了新的挑战。本文将从数据库分片、复制、事务管理及性能调优等方面阐述最佳实践,旨在为开发者提供一套系统性的解决方案框架。 ####
|
14天前
|
XML 前端开发 Android开发
Kotlin教程笔记(80) - MVVM架构设计
Kotlin教程笔记(80) - MVVM架构设计
|
20天前
|
开发者 容器
Flutter&鸿蒙next 布局架构原理详解
本文详细介绍了 Flutter 中的主要布局方式,包括 Row、Column、Stack、Container、ListView 和 GridView 等布局组件的架构原理及使用场景。通过了解这些布局 Widget 的基本概念、关键属性和布局原理,开发者可以更高效地构建复杂的用户界面。此外,文章还提供了布局优化技巧,帮助提升应用性能。
80 4
|
19天前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
55 1
|
20天前
|
存储 Dart 前端开发
flutter鸿蒙版本mvvm架构思想原理
在Flutter中实现MVVM架构,旨在将UI与业务逻辑分离,提升代码可维护性和可读性。本文介绍了MVVM的整体架构,包括Model、View和ViewModel的职责,以及各文件的详细实现。通过`main.dart`、`CounterViewModel.dart`、`MyHomePage.dart`和`Model.dart`的具体代码,展示了如何使用Provider进行状态管理,实现数据绑定和响应式设计。MVVM架构的分离关注点、数据绑定和可维护性特点,使得开发更加高效和整洁。
146 3
|
9天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
7天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
7天前
|
Dubbo Java 应用服务中间件
服务架构的演进:从单体到微服务的探索之旅
随着企业业务的不断拓展和复杂度的提升,对软件系统架构的要求也日益严苛。传统的架构模式在应对现代业务场景时逐渐暴露出诸多局限性,于是服务架构开启了持续演变之路。从单体架构的简易便捷,到分布式架构的模块化解耦,再到微服务架构的精细化管理,企业对技术的选择变得至关重要,尤其是 Spring Cloud 和 Dubbo 等微服务技术的对比和应用,直接影响着项目的成败。 本篇文章会从服务架构的演进开始分析,探索从单体项目到微服务项目的演变过程。然后也会对目前常见的微服务技术进行对比,找到目前市面上所常用的技术给大家进行讲解。
18 1
服务架构的演进:从单体到微服务的探索之旅