Presto 架构原理与优化介绍 | 青训营笔记

56 阅读2分钟

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

Presto架构

image.png

Presto查询引擎是一个Master-Slave的架构,由下面三部分组成:

一个Coordinator节点
一个Discovery Server节点
多个Worker节点

Coordinator: 负责解析SQL语句,生成执行计划,分发执行任务给Worker节点执行

Discovery Server: 通常内嵌于Coordinator节点中

Worker节点: 负责实际执行查询任务,负责与HDFS交互读取数据, Worker节点启动后向Discovery Server服务注册,Coordinator从Discovery Server获得可以正常工作的Worker节点。如果配置了Hive Connector,需要配置一个Hive MetaStore服务为Presto提供Hive元信息。

Presto低延迟原理

  • 完全基于内存的并行计算
  • 流水线式计算作业
  • 本地化计算
  • 动态编译执行计划
  • GC控制

Presto存储插件

  • Presto设计了一个简单的数据存储的抽象层, 来满足在不同数据存储系统之上都可以使用SQL进行查询。
  • 存储插件(连接器,connector)只需要提供实现以下操作的接口, 包括对元数据(metadata)的提取,获得数据存储的位置,获取数据本身的操作等。
  • 除了我们主要使用的Hive/HDFS后台系统之外, 我们也开发了一些连接其他系统的Presto 连接器,包括HBase,Scribe和定制开发的系统

插件结构图: image.png

presto执行过程

image.png

提交查询: 用户使用Presto Cli提交一个查询语句后,Cli使用HTTP协议与Coordinator通信,Coordinator收到查询请求后调用SqlParser解析SQL语句得到Statement对象,并将Statement封装成一个QueryStarter对象放入线程池中等待执行

image.png

逻辑执行过程

image.png

逻辑执行计划图中的虚线就是Presto对逻辑执行计划的切分点,逻辑计划Plan生成的SubPlan分为四个部分,每一个SubPlan都会提交到一个或者多个Worker节点上执行

presto引擎对比

image.png

常用的性能分析工具

Grafana
Arthas
Flame Figure(火焰图)
java指令:jstack等指令