这是我参与「第四届青训营 」笔记创作活动的第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基础概念主要可以分为哪几类?
- 服务相关概念
- 数据源相关概念
- Query相关概念
- 数据传输相关概念
Presto的通信方式有哪些,Thrift通信的优势
Http 1.1 vs Thrift
Thrift具有更好的数据编码能力,Http 1.1还不支持头部信息的压缩,Thrift具有更好的数据压缩率
Presto Worker的不同状态
- Active
- InActive
- Shutdown
重要机制
Presto用户多租户隔离的手段是什么?
- Presto 通过Resource Group对不同的用户创建不同Group从而实现不同租户,不同场景的资源管理
Presto Resource Group的优缺点
优点:支持通配符的形式,对不同租户,不同提交场景下的用户进行限制
缺点:资源的管理和判断是以当前用户正在运行的SQL资源使用量为基准,对于低频大SQL场景不太适用
Presto是从哪几个方面实现了多租户的任务调度
- Stage调度策略
- Task的节点选择策略
- Split调度策略
Presto Stage调度的方式有哪些?
- AllAtOnceExecutionPolicy
- PhasedExecutionPolicy
Presto 进行 Task 调度时,有哪些调度方式?
- HARD_AFFINITY: 计算、存储 Local 模式,保障计算与存储在同一个节点,减少数据传输
- SOFT_AFFINITY: 基于某些特定算法,如一致性HASH函数,常用于缓存场景,保证相似的 Task 调度到同一个 Worker
- NO_PREFERENCE: 随机选取,常用于普通的纯计算 Task
Presto是如何实现Back pressure mechanism的
- 控制split生成流程
- 针对每个Task定时检查, 如果 OutputBuffers 使用率低于 0.5 (下游消费较快, 需要提高生产速度), Split 并发度+1
- 控制Operator执行速度
- "sink.max-buffer-size" 写入buffer的大小控制
- "exchange.max-buffer-size" 读取buffer的大小控制
- Buffer 达到最大值时Operator会进入阻塞状态
Presto多数据源支持的优点与缺点
优点:支持多数据源的联邦查询
- 缺点:针对不同数据源,还存在许多问题需要解决
-
- 谓词下推
- 每个数据源都需要单独的一套catalog管理
- 如何针对数据源进行分片操作