Presto 架构原理与优化介绍笔记(二)| 青训营笔记
这是我参与「第四届青训营 -大数据场」笔记创作活动的第10天
三、重要机制
1. Presto用户多租户隔离
Presto通过resource group对不同的用户创建不同group从而实现不同租户、不同场景的资源管理
2. Presto Resource Group优缺点
-
优点
- 支持通配符形式:简单配置文件实现
- 对不同租户不同提交场景下用户进行限制
-
缺点
- 存在滞后性
- 只会对group中正在运行的SQL资源进行判断
3. Presto物理计划生成
- Antlr4解析生成AST
- 转换为Logical Plan
- 按照是否存在shuffle(exchange)切分为不同stage(fragment)
4. Presto多租户任务调度
4.1 stage调度
-
AllAtOnceExecutionpolicy 同时调度
-
延迟低 存在任务空跑
-
典型应用为join查询
- build端右表构建join的hashtable
- probe端:左表数据进行探查,等待build完成
- build端构建hashtable时probe在空跑
-
-
phased Execution policy
- 不代表每个stage都分开调度
- 可以分开处理,无需等待stage完成
- 内存友好无需落盘
- 有一定延迟、节省部分资源
4.2 task调度
-
数量确定
- source:根据数据meta决定分配多少节点
- fixed:hash partition count确定如集群节点数量
- sink:汇聚结果一台机器
- scaled:无分区限制,可扩展,如write数据
- coordinator_only:只需要coordinator参与
-
选择什么节点
- HARD_AFFINITY:计算、存储local模式,保障计算与存储在同一节点减少数据传输
- SOFT_AFFINITY:基于某些特定算法,如一致性HASH函数;常用于缓存场景,保证相似的task调度到同一个worker
- NO_PREFERENCE:随机选取,常用于普通的纯计算Task
4.3 split调度
-
FIFO:顺序执行,绝对公平
-
优先级调度:快速响应
- 按照固定时间片轮巡Split处理数据,处理1s再重新选择一个split执行
- split之间存在优先级
- multiLevelSplitQueue:五个优先级level理论上时间占比为16:8:4:2:1
-
优势
- 优先保证小query快速执行
- 保障大query存在固定比例时间片,不会被完全饿死 (优先级很低也能有时间)
5. 内存计算
5.1 pipeline化的数据处理
-
pipeline按照localExchange拆分
- 更好的实现算子间并行
- 语义上保证算子执行并行
5.2 back pressure mechanism
-
控制split生成流程
-
控制operator执行
-
targetConcurrency auto-scale-out
- 定时检查如果outputbuffers使用率低于0.5(下游消费速度更快,需要提高生产数据),并发度+1
-
sink.max-buffer-size写入buffer大小控制
-
exchange.max-buffer-size读取buffer大小控制
-
达到最大值时operator进入阻塞状态
6. 多数据源联邦查询
将各个数据源进行统一抽象,最后由presto server进行统一的物理执行
- 优点:支持多数据源的联邦查询
-
缺点:针对不同数据源,还存在许多问题需要解决
- 谓词下推(不同SQL处理不同)
- 每个数据源都需要单独的一套catalog管理
- 如何针对数据源进行分片操作
四、性能优化
1. 常用的性能分析工具
1.1 Grafana
- 埋点、系统指标如CPU、内存网络等可视化界面,时序化的数据展示
1.2 Arthas
- 不重启服务可以监控
- watch:监控每个函数入参、返回参数、异常等信息
- trace:统计函数内每一步的执行时间
- 需要自己猜出问题大体在哪一段
1.3 Java指令
- jstack查看java线程栈信息,排查死锁、异常线程
- JMX(Java Management Extensions)为应用程序植入管理功能框架,做监控指标的统计收集
- JMAP & GC日志等内存分析工具
1.4 Flame Figure火焰图
- 分析热点代码占用大量CPU从而导致服务性能下降情况
1.5 Presto UI
- Query级别统计信息
- Logical plan
- Stage、Task信息
- Worker状态信息