presto 架构原理及优化 | 青训营笔记

140 阅读5分钟

这是我参与「第四届青训营」笔记创作活动的的第7天

presto概述

大数据与OLAP

  • OLAP  (OnLine Analytical Processing) 对业务数据执行多维分析,并提供复杂计算,趋势分析和复杂数据建模的能力。是许多商务智能(BI)应用程序背后的技术。现如今OLAP已经发展为基于数据库通过SQL对外提供分析能力。
  • OLAP核心概念:维度、度量

presto设计思路

Presto最初是由facebook研发的构建于Hadoop/HDFS系统之上的PB级交互式分析引擎,其具有如下的特点:

  • 多租户任务的管理与调度
  • 多数据源联邦查询
  • 支持内存化计算
  • pipeline式数据处理

presto二次开发项目:prestodb、trino、openlookeng

presto基础原理

presto架构图

3f1b156cc4e64e7783ea28c12ef71e66_tplv-k3u1fbpfcp-zoom-in-crop-mark_3024_0_0_0.webp

服务相关概念

  • coordinator:解析SQL语句;生成执行计划;分发执行任务给worker节点
  • worker:执行task处理数据,与其他worker交互传输数据

数据源相关概念

  • connector:代表数据源。connector是由presto提供的适配多数据源的统一接口
  • catalog:管理元信息与实际数据的映射关系

query相关概念

query:基于SQL parser后获得的执行计划 stage:根据是否需要shuffle将query拆分成不同的subplan,每一个subplan便是stage fragment:基本等价于stage,只是不同阶段 task:单个worker节点上的最小资源管理单元,其中在一个节点上,一个stage只有一个task,一个query可能有多个task

数据传输相关

  • exchange:表示不同stage间的数据传输,大致等价于shuffle
  • localExchange:stage内的rehash操作,用于提高并行处理数据的能力,默认数值为16
  • 某个任务某个stage的真实并行度为不同pipeline下driver的数目之和

通信机制

http通用,coordinator与worker、worker与worker间的通信可thrift/http。

Http 1.1 vs Thrift

Thrift具有更好的数据编码能力,Http 1.1还不支持头部信息的压缩,Thrift具有更好的数据压缩率

节点状态

active inactive shutdowm

presto重要机制

Presto用户多租户隔离的手段是什么?

  • 通过Resource Group对不同的用户创建不同Group从而实现不同租户,不同场景的资源管理。
  • Resource Group类似yarn多级队列的资源管理方式,基于CPU、memory、SQL执行数进行资源使用量限制
  • 优点:轻量的query级别的多级队列资源管理方式
  • 缺点:滞后性,只会对group中正在运行的SQL进行判断

Presto是从哪几个方面实现了多租户的任务调度

  • Stage调度策略
  • Task的节点选择策略
  • Split调度策略

Presto Stage调度的方式有哪些?

  • AllAtOnceExecutionPolicy 同时调度,会存在任务空跑
  • PhasedExecutionPolicy 分阶段调度,有一定的延迟,节省部分资源

Presto 进行 Task 调度时,有哪些调度方式?

  • HARD_AFFINITY: 计算、存储 Local 模式,保障计算与存储在同一个节点,减少数据传输
  • SOFT_AFFINITY:基于某些特定算法,如一致性HASH函数,常用于缓存场景,保证相似的 Task 调度到同一个 Worker
  • NO_PREFERENCE:随机选取,常用于普通的纯计算 Task

内存计算

  • pipeline化的数据处理:按localexchange拆分,更好地实现算子间的并行,保证了每个task内的数据流式处理
  • back pressure mechanism:控制split生成流程,控制operator的执行

多数据源联邦查询

将各个数据源进行统一的抽象,最后由presto server进行统一的物理执行

  • 优点:支持多数据源的联邦查询
  • 缺点:针对不同数据源,还存在许多问题需要解决
    • 谓词下推
    • 每个数据源都需要单独的一套catalog管理
    • 如何针对数据源进行分片操作

性能优化

常见性能优化工具

grafana

埋点、系统指标等的可视化界面,时序化的数据展示

线上问题排查工具:arthas

  1. watch:监控每个函数入参、返回参数、异常等信息
  2. trace:统计函数内每一步的执行时间

线上问题排查工具:flame figure火焰图

用于分析热点代码占用大量CPU,从而导致服务性能下降的情况。自底向上为调用关系,上层宽度越宽表示当前函数CPU耗时越久。

java相关指令

  • jstack查看java线程栈信息,排查有无死锁或异常线程
  • java management extensions,为应用程序植入管理功能的框架,用于监控指标的统计收集
  • JMAP/GC日志,内存分析工具

案例

减少 hadoop 配置构建时间

对于具有大量分区的表,创建hadoop配置会消耗大量的cpu时间。特别是“hdfs-site.xml”和“core-site.xml”文件很大。

描述

数据:tpcds 1T
表:store_returns(约2000个分区)
sql:select count(*) from store_returns
查询执行时间:约3-4s

问题

发现函数'ConfigurationUtil.copy'消耗了cpu时间。

因为复制功能会遍历旧配置,然后设置为新配置,这会导致map rehash操作和其他cpu消耗操作。

解决方案

  • 配置支持由其他配置构建。所以我们不需要使用 ConfigurationUtil.copy 函数。
  • 对底层数据直接clone
  • 通过优化配置构建流程,查询运行时间从4秒缩短到1秒

SQL执行缓慢,某几个节点CPU负载特别高

  • 正则表达式不可中断,阻塞了split的优先级调度;与正则表达式匹配的实际数据不可控
  • 解决思路:实现一个可中断的正则表达式;

优化实践

multi coordinator

  • 针对coordinator 单节点稳定性差
  • 不可用时间大幅减少,实现高可用的效果;实现coordinator多活,压力分担

History server

提供与presto UI相同体验与持久化的数据存储,解决SQL历史长期的查询问题,持久化体验

support remote UDF

  • 统一的UDF抽象,适配多引擎
  • 多租户的内核与网络隔离

raptorX的多级缓存