1. Presto 简介

一、Presto 基本认识

1.1 定义

Presto 是于 2013 年 11 月份由 FaceBook 的开源了,一个分布式 SQL 查询引擎,它被设计为用来专门进行快速、实时的数据分析。它支持标准的 ANSI SQL,无论是对多数据源支持,还是高性能、易用性、可扩展性等方面,Presto 都是 OLAP 产品中的佼佼者。Presto 从 0.215 版本之后就分裂出两个不同的版本,并由不同的组织主导开发。

PrestoSQL(2020.12 更名为 Trino) PrestoDB
主导开发 Presto Software Foundation(2019.01.31) Linux Foundation/Presto Foundation(2019.09.23
创始成员 Martin Traverso, Dain Sundstrom, David Phillips Facebook, Alibaba, Twitter, Uber
最新版本 Release 330(从 300 开始) Release 0.232

prestodb-repo
prestosql-trino-repo

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

和大家熟悉的 MySQL 相比:

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

1.2 数据源

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

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

1.3 优势

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

举例:

SELECT id,
    name,
       source_type,
       created_at
FROM dw_dwb.dwb_user_day
WHERE dt='2018-06-03'
  AND created_at> '2018-05-20’;

上述 SQL 在 Presto 运行时间不到 1 秒钟,在 Hive 里要几十秒钟。

1.4 数据模型

Presto 使用 CatalogSchemaTable 这 3 层结构来管理数据。

  • Catalog
    即数据源。Hive 是数据源,MySQL 也是数据源,Presto 可以连接多个 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 分区,即分目录,把一个大的数据集根据业务需要分割成更细的数据集。

举例:假如一个表的数据都放在 /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 终端界面。

./presto-cli.jar --server presto.xxx-apps.com:9200 --catalog hive --user xxxx --source 'pf=adhoc;client=cli'

先解释下各参数的含义:

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

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

Presto 使用手册:https://prestodb.io/docs/current/

四、问答:

3.1 使用场景?

  • MySQL 跨数据库查询;
  • 数仓的表数据查询(数据分析)
  • ...

3.2 为什么 presto 查询速度比 Hive 快?

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

参考

Tags , ,