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

174 阅读6分钟

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

概述

定义

Presto是一个分布式的查询引擎,本身并不存储数据,但是可以接入多种数据源,并且支持跨数据源的级联查询。Presto是一个OLAP的工具,擅长对海量数据进行复杂的分析;但是对于OLTP场景,并不是Presto所擅长,所以不要把Presto当做数据库来使用。

和大家熟悉的Mysql相比:首先Mysql是一个数据库,具有存储和计算分析能力,而Presto只有计算分析能力;其次数据量方面,Mysql作为传统单点关系型数据库不能满足当前大数据量的需求,于是有各种大数据的存储和分析工具产生,Presto就是这样一个可以满足大数据量分析计算需求的一个工具。

Presto是一个低延迟高并发的内存计算引擎,相比Hive,执行效率要高很多。

数据源

Presto需要从其他数据源获取数据来进行运算分析,它可以连接多种数据源,包括Hive、RDBMS(Mysql、Oracle、Tidb等)、Kafka、MongoDB、Redis等

一条Presto查询可以将多个数据源的数据进行合并分析。 比如:select * from a join b where a.id=b.id;,其中表a可以来自Hive,表b可以来自Mysql。

数据模型

Presto使用Catalog、Schema和Table这3层结构来管理数据。

---- Catalog:就是数据源。Hive是数据源,Mysql也是数据源,Hive 和Mysql都是数据源类型,可以连接多个Hive和多个Mysql,每个连接都有一个名字。一个Catalog可以包含多个Schema,大家可以通过show catalogs 命令看到Presto连接的所有数据源。 ---- Schema:相当于一个数据库实例,一个Schema包含多张数据表。show schemas from 'catalog_name'可列出catalog_name下的所有schema。 ---- Table:数据表,与一般意义上的数据库表相同。show tables from 'catalog_name.schema_name'可查看'catalog_name.schema_name'下的所有表。

在Presto中定位一张表,一般是catalog为根,例如:一张表的全称为 hive.test_data.test,标识 hive(catalog)下的 test_data(schema)中test表。 可以简理解为:数据源的大类.数据库.数据表。

Presto与Hive

Hive是一个基于HDFS(分布式文件系统)的一个数据库,具有存储和分析计算能力, 支持大数据量的存储和查询。Hive 作为数据源,结合Presto分布式查询引擎,这样大数据量的查询计算速度就会快很多。

Presto支持标准SQL,这里需要提醒大家的是,在使用Hive数据源的时候,如果表是分区表,一定要添加分区过滤,不加分区扫描全表是一个很暴力的操作,执行效率低下并且占用大量集群资源,大家尽量避免这种写法。

这里提到Hive分区,我简单介绍一下概念。Hive分区就是分目录,把一个大的数据集根据业务需要分割成更细的数据集。

举例:假如一个表的数据都放在/user/xiaoming/table/目录下,如果想把数据按照每天的数据细分,则就变成/user/xiaoming/table/2018-06-01/,/user/xiaoming/table/2018-06-02/,……如果查询某一天的数据,就可以直接取某一天目录下的数据,不需要扫描其他天的数据,节省了时间和资源。

Presto接入方式

Presto的接入方式有多种:presto-cli,pyhive,jdbc,http,golang,SQLAlchemy,PHP等,其中presto-cli是Presto官方提供的,下面以presto-cli为例展开说明(自行下载)。

以连接hive数据源为例,在电脑终端输入:./presto-cli.jar --server presto.xxx-apps.com:9200 --catalog hive --user xxxx --source 'pf=adhoc;client=cli'就可以进入presto终端界面。

先解释下各参数的含义:

--server 是presto服务地址; --catalog 是默认使用哪个数据源,后面也可以切换,如果想连接mysql数据源,使用mysql数据源名称即可; --user 是用户名; --source 是代表查询来源,source设置格式为key=value形式(英文分号分割); 例如个人从command line查询应设置为pf=adhoc;client=cli。

进入终端后: 查看数据源: show catalogs; 查看数据库实例:show schemas;

Presto使用手册:prestodb.io/docs/curren…

question

1.使用场景? -mysql跨数据库查询;-数仓的表数据查询(数据分析) ...

2.为什么presto查询速度比Hive快? presto是常驻任务,接受请求立即执行,全内存并行计算;hive需要用yarn做资源调度,接受查询需要先申请资源,启动进程,并且中间结果会经过磁盘。

基础概念

Presto基础概念主要可以分为哪几类?

  1. 服务相关概念
  2. 数据源相关概念
  3. Query相关概念
  4. 数据传输相关概念

Presto的通信方式有哪些,Thrift通信的优势

Http 1.1 vs Thrift

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

Presto Worker的不同状态

  1. Active
  2. InActive
  3. Shutdown

重要机制

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

  1. Presto 通过Resource Group对不同的用户创建不同Group从而实现不同租户,不同场景的资源管理

Presto Resource Group的优缺点

优点:支持通配符的形式,对不同租户,不同提交场景下的用户进行限制

缺点:资源的管理和判断是以当前用户正在运行的SQL资源使用量为基准,对于低频大SQL场景不太适用

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

  1. Stage调度策略
  2. Task的节点选择策略
  3. Split调度策略

Presto Stage调度的方式有哪些?

  1. AllAtOnceExecutionPolicy
  2. PhasedExecutionPolicy

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

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

Presto是如何实现Back pressure mechanism的

  1. 控制split生成流程
  2. 针对每个Task定时检查, 如果 OutputBuffers 使用率低于 0.5 (下游消费较快, 需要提高生产速度), Split 并发度+1
  3. 控制Operator执行速度
  4. "sink.max-buffer-size" 写入buffer的大小控制
  5. "exchange.max-buffer-size" 读取buffer的大小控制
  6. Buffer 达到最大值时Operator会进入阻塞状态

Presto多数据源支持的优点与缺点

优点:支持多数据源的联邦查询

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