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等指令
相关文章
|
3天前
|
运维 监控 安全
WLAN的组网架构和工作原理
WLAN的组网架构和工作原理
9 0
|
3天前
|
存储 移动开发 前端开发
【Uniapp 专栏】Uniapp 架构设计与原理探究
【5月更文挑战第12天】Uniapp是一款用于跨平台移动应用开发的框架,以其高效性和灵活性脱颖而出。它基于HTML、CSS和Vue.js构建视图层,JavaScript处理逻辑层,管理数据层,实现统一编码并支持原生插件扩展。通过抽象平台特性,开发者能专注于业务逻辑,提高开发效率。尽管存在兼容性和复杂性挑战,但深入理解其架构设计与原理将助力开发者创建高质量的跨平台应用。随着技术进步,Uniapp将继续在移动开发领域扮演重要角色。
【Uniapp 专栏】Uniapp 架构设计与原理探究
|
3天前
|
SQL canal 运维
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
|
3天前
|
负载均衡 NoSQL 关系型数据库
深入浅出Redis(六):Redis的主从架构与主从复制原理
深入浅出Redis(六):Redis的主从架构与主从复制原理
|
3天前
|
Kubernetes Cloud Native 持续交付
探索云原生架构的未来:如何优化资源管理和服务部署
【5月更文挑战第6天】 随着云计算的快速发展,云原生技术已成为企业数字化转型的关键驱动力。此篇文章深入探讨了云原生架构的核心组件及其在资源管理和服务部署方面的优化策略。通过分析容器化、微服务及自动化管理的实践案例,本文旨在为读者提供一套系统的方法论,以利用云原生技术实现更高效、灵活且可靠的IT基础设施。
30 2
|
3天前
|
负载均衡 Java 开发者
Spring Cloud:一文读懂其原理与架构
Spring Cloud 是一套微服务解决方案,它整合了Netflix公司的多个开源框架,简化了分布式系统开发。Spring Cloud 提供了服务注册与发现、配置中心、消息总线、负载均衡、熔断机制等工具,让开发者可以快速地构建一些常见的微服务架构。
|
3天前
|
SpringCloudAlibaba Dubbo 应用服务中间件
【微服务】微服务初步认识 - 微服务技术如何学习 · 认识微服务架构
【微服务】微服务初步认识 - 微服务技术如何学习 · 认识微服务架构
12 0
|
22小时前
|
Kubernetes API 数据库
构建高效微服务架构:后端开发的新趋势
【5月更文挑战第17天】 随着云计算的普及和容器化技术的成熟,微服务架构已成为企业软件开发的首选模式。该架构通过将大型应用程序拆分为一系列小型、自治的服务来提供灵活性和可扩展性。本文将探讨微服务架构的关键概念,包括服务的细粒度划分、独立部署、以及如何通过容器编排实现高可用性。同时,我们将讨论微服务实施的最佳实践和面临的挑战,为后端开发者提供构建和维护微服务系统的实用指南。
|
1天前
|
Kubernetes 持续交付 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【5月更文挑战第17天】在当今云计算和微服务架构的大潮中,Docker容器化技术和Kubernetes容器编排系统成为了后端开发领域的热门技术栈。本文将探讨如何通过Docker和Kubernetes的结合使用来构建一个高效、可扩展且易于管理的微服务环境。我们将从基础概念出发,深入到实际操作层面,最后讨论这种组合对持续集成和持续部署(CI/CD)流程的影响,旨在为开发者和企业提供一种可靠的后端服务解决方案。
|
1天前
|
XML 负载均衡 数据库
构建高性能微服务架构:挑战与策略
【5月更文挑战第17天】 在当今的软件开发领域,微服务架构已成为实现系统模块化和解耦的重要手段。它允许开发团队独立地开发、部署和扩展应用的各个部分,从而提高了整体系统的灵活性和可维护性。然而,随着服务的增多和分布式环境的复杂性提升,确保这些微服务高效运作面临着不少挑战。本文将探讨在构建高性能微服务架构时常见的问题,并提出一系列解决策略,以帮助开发者优化其系统性能和稳定性。