这是我参与「第四届青训营 」笔记创作活动的第10天
本次笔记重点内容
- 介绍 OLAP 的演进之路、Presto 的设计理念
- 介绍 Presto 的基础概念与原理
- 对 Presto 的特色和重要机制进行讲解和剖析
- 介绍 Presto 常用的优化工具以及在字节内部的相关优化
OLAP
大数据分析引擎,对业务数据执行多维分析,提供复杂计算、趋势分析和复杂数据建模能力
OLAP VS MapReduce
MapReduce使用门槛较高,OLAP引擎通过SQL为数据分析和开发人员提供了统一的逻辑描述语言
核心概念——维度 & 度量
常见OLAP引擎
- 预计算引擎,Kylin、Druid
- 批式处理引擎,Spark、Hive
- 流式处理引擎,Flink
- 交互式处理引擎,重点在于对用户体验做实时分析,用户能多快查出结果,解决延迟问题
Presto
建于Hadoop(基于廉价机器的存算分离的大规模分布式处理系统)/HDFS系统上的PB级交互式分析引擎,支持内存化计算和Pipeline式数据处理(流式)
基础概念与原理
- 服务相关
Presto服务就是红色框内,Coordinator做调度和SQL解析,Worker做实际处理,当客户端提交一个查询的时候,coordinator会从当前存活的worker中选择出适合的worker节点去运行task
- 数据源相关
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 架构图
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 火焰图