这是我参与「第四届青训营 」笔记创作活动的第3天
简介:Presto 作为大数据领域常见的计算引擎,支持多数据源联邦查询、多租户任务的管理与调度,并且具有内存化计算、pipeline化处理数据等特点,使其在交互式 SQL 查询领域中被广泛使用。
课前预习
Presto的基础概念
先给出Presto架构图如下:
服务器类型:
Presto 服务器有三种类型:resource manager, coordinators 和 workers.
Resource Manager: 自所有coordinators和workers的数据并构造群集全局视图的服务器
coordinator(负责调度): 负责解析语句、规划查询和管理 Presto 工作线程节点的服务器
- 解析SQL语句
- 生成执行计划
- 分发执行任务给Worker节点执行
worker: 负责执行任务和处理数据。工作节点从connectors 获取数据并相互交换中间数据。coordinator负责从workers那里获取结果并将最终结果返回给client。
当 Presto 工作进程启动时,它会将自身通告到coordinator中的Discovery Service(发现服务器),这使 Presto coordinator能够执行任务
Discovery Service(将coordinator和woker结合到一起的服务):
- Worker节点启动后向Discovery Server服务注册
- Coordinator从Discovery Server获得Worker节点
数据源
Connector
Presto通过Connector来支持多数据源,一个Connector代表一种数据源,如Hive Connector代表了对Hive数据源的支持。可以认为Connector是由Presto提供的适配多数据源的统一接口
Catalog 针对不同的数据源,Connector和Catalog是一一对应的关系,Catalog包含了schema和data source的映射关系。
管理元信息的数据的关系 Schema Schema是组织表的一种方法,Catalog和Schema共同定义了一组可以查询的表。
Table 和数据库中的表相似,从源数据到表的映射由连接器定义。
Query Execution Model(查询执行模型)
Presto 执行 SQL 语句,并将这些语句转换为在coordinator和workers的分布式集群中执行的查询。
Query
基于SQL parser后获得的执行计划
Stage
根据是否需要shuffle将Query拆分成不同的subplan,每一个subplan便是一个stage 组成查询的 Fragment
基本等价于Stage,属于在不同阶段的称呼,在本门课程可以认为两者等价Stage层次类似于树,每个查询都有一个根阶段,负责其Stage的输出。Stage本身不在worker上运行
Task
单个 Worker 节点上的最小资源管理单元: 在一个节点上, 一个 Stage 只有一个 Task, 一个 Query 可能有多个Task
Pipeline
Stage 按照 LocalExchange 切分为若干 Operator 集合, 每个 Operator 集合定义一个 Pipeline
LocalExchange:在stage内部作一次数据shuffle,rehash操作
Driver
Pipeline 的可执行实体 , Pipeline 和 Driver 的关系可类比 程序和进程 ,是最小的执行单元,通过 火山迭代模型执行每一个Operator
Split
输入数据描述(数据实体是 Page), 数量上和 Driver 一一对应,不仅代表实际数据源split,也代表了不同stage间传输的数据
Operator
最小的物理算子,操作员使用、转换和生成数据。
Exchange
在 Presto 节点之间交换查询不同Stage的传输数据。任务将数据生成到输出缓冲区中,并使用 Exchange 客户端使用其他任务中的数据。
课上
什么是大数据?
信息交换,信息存储,信息处理三方面能力的大幅提增
什么是OLAP?
OLAP (OnLine Analytical Processing) 对业务数据执行多维分析,并提供复杂计算,趋势分析和复杂数据建模的能力。是许多商务智能(BI)应用程序背后的技术。现如今OLAP已经发展为基于数据库通过SQL对外提供分析能力
事实上,MapReduce模型使用门槛高; 但OLAP引擎使用sql的方式就可以了,学习成本比较低,更加快速的上手和使用
OLAP核心概念: 维度和度量
基础原理和概念
基础概念(前面未提到和补充)
联邦查询:多数据源的join联合分析
通信机制
Client /JDBC Client 与Server :Http Coordinator 与Worker:Thrift/Http Worker 与Worker:Thrift/Http
Thrift有更好的编码能力,Http 1.1还不支持头部信息的压缩,Thrift具有更好的数据压缩率
Presto Worker的不同状态
- Active
- InActive
- Shutdown
重要机制
多租户资源管理
给出问题:某个用户提交一个SQL,是否能提交成功?
是否能提交成功?
Resource Group Presto 通过Resource Group对不同的用户创建不同Group从而实现不同租户,不同场景的资源管理
配置文件匹配匹配:
- rootGroups
- selectors
优点和缺点
-
优点:支持
通配符的形式,对不同租户,不同提交场景下的用户进行限制,轻量的query级别的多级队列资源管理模式 -
缺点:资源的管理和判断是以当前用户正在运行的SQL资源使用量为基准,对于低频大SQL场景不太适用。存在一定
滞后性
多租户下的任务调度
SQL解析生产AST,转换为物理计划,根据是否存在shuffle进行切分stage(Fragment)
Stage 调度
-
AllAtOnceExecutionPolicy 同时调度 延迟点,会存在任务空跑
-
PhasedExecutionPolicy 分阶段调度 有一定延迟、节省部分资源
Task 调度 Task数量如何确定?
数量的确定?
- Source:meta,数据量的大小和元信息
- Fixeed:shuffle,分区的多少
- Sink:汇聚结果,一台机器
- Scaled:用于DML语句,无分区限制
- Coordinator_Only:coordinator,有时候计算结果可以直接通过一个节点或者元数据得到。
选择什么样的节点?
- HARD_AFFINITY: 计算、存储 Local 模式,保障计算与存储在同一个节点,减少数据传输
- SOFT_AFFINITY: 基于某些特定算法,如一致性HASH函数,常用于缓存场景,保证相似的 Task 调度到同一个 Worker
- NO_PREFERENCE: 随机选取,常用于普通的纯计算 Task
Split调度
提出问题: quary A 大SQL 先提交 quary B 小SQL 后提交 是不是先执行完A再执行B
quary A和Quary B的执行先后
有两种调度方式: FIFO,优先级调度
因为OLAP的特性,查询需要尽可能的快速响应,得到结果;所以 优先保证小Query快速执行; 同时保障大Query存在固定比例的时间片,不会被完全饿死
内存计算
Presto 默认纯内存计算,也允许落盘
Pipeline 化的数据处理
保证每个task的流式处理,更好的实现算子之间的并行
反压机制
- 控制源头的生产速度
- 控制尾巴的消费速度
- 控制buffer写入和读取的速度
多数据源联邦查询
局限性:
- 元数据管理与映射,每个数据源都需要单独的一套catalog管理
- 谓词下推
- 数据源分片
性能优化实战
常用的性能分析工具
- Grafana
- Arthas
- Flame Figure(火焰图)
- java指令:jstack等指令
Grafana: 埋点、系统指标的可视化界面,时序化的数据展示
java相关指令
- jstack 可用来查看java线程栈信息
- JMX为用户程序植入管理程序,统计信息手机
- JMAP&GC日志等内存分析工具
Arthas(线上问题排查工具)
在不重启的情况下进行监控
- watch:监控每个函数入参、返回参数、异常等信息
- trace:统计函数内每一步的执行时间,通过查看调用栈的方式
Flame Figure(火焰图)
火焰图用于分析热点代码占用大量cpu,从而导致服务性能下降的情况。如下图,自底向上为调用关系。
上层宽度越宽表示当前函数cpu耗时越久,我们关注最宽的函数调用。
Presto UI
显示Presto的相关信息
一些优化实践
Multi Coordinator -> Coordinator多活
History Server 的开启 -> 提供与Presto UI相同的体验,还有持久性数据存储,便于集群任务日志的查看和检查
Support Remote UDF -> 统一的UDF抽象,适配多引擎
RaptorX 的多级缓存
个人总结
这次课程学习了OLAP引擎Presto,涉及到许多Presto架构里的许多基本概念,但是与大多数分布式系统引擎一样,有一个master和多个worker,同时有discover server作为Coordinator和worker的中间点,使得Coordinator获取worders的活跃状态。
本次课程需要理解Presto的架构和一些基本概念,其次还需要了解Presto的一些重要机制,其中的任务调度机制需要重点理解,学会计算并行度和搞清楚Presto的任务工作流程。最后需要明确的是Presto是一个OLAP引擎,交互式的计算引擎,不能与其他流批式计算引擎相混淆。
引用
【大数据专场 学习资料三】第四届字节跳动青训营 - 掘金 (juejin.cn)
Presto Concepts — Presto 0.273.3 Documentation (prestodb.io)