即席查询工具很多,需要记住几种常用的工具。我面试中被问到了为什么项目中使用这个工具。要回到这个问题就需要知道每个即席查询工具的特点和区别,对比它们的不同,然后说出选这个工具的理由。今天首先了解以下 Presto。还是打开官网看一下描述。

1.简介

Distributed SQL Query Engine for Big Data

用于大数据的分布式 SQL 查询引擎。

WHAT IS PRESTO?

Presto is an open source distributed SQL query engine for running interactive analytic queries against data sources of all sizes ranging from gigabytes to petabytes.

Presto was designed and written from the ground up for interactive analytics and approaches the speed of commercial data warehouses while scaling to the size of organizations like Facebook.

Presto 是一个开源分布式 SQL 查询引擎,用于针对 GB 到 PB 的各种大小的数据源运行交互式分析查询。

Presto 是从头开始设计和编写的,用于交互式分析,并接近商业数据仓库的速度,同时扩展到像 Facebook 一样规模的组织。

WHAT CAN IT DO?

Presto allows querying data where it lives, including Hive, Cassandra, relational databases or even proprietary data stores. A single Presto query can combine data from multiple sources, allowing for analytics across your entire organization.

Presto is targeted at analysts who expect response times ranging from sub-second to minutes. Presto breaks the false choice between having fast analytics using an expensive commercial solution or using a slow “free” solution that requires excessive hardware.

Presto 可以从各种数据源查询数据,包括 Hive、Cassandra、关系数据库甚至专有数据存储。单个 Presto 查询可以组合来自多个来源的数据,从而实现横跨整个组织进行分析。

Presto 面向期望亚秒到几分钟响应的分析师。Presto 打破了使用昂贵的商业解决方案进行快速分析或使用需要过多硬件的缓慢“免费”解决方案之间的错误选择。

总结以下:Presto 是一个开源的分布式 SQL 查询引擎,支持多种数据源,数据量支持 GB 到 PB 级别,可以实现亚秒级响应。

2.架构

Presto 由一个 Coordinator 和多个 Worker 组成。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uVWPfEbh-1651385753189)(.\20220502\微信截图_20220501140040.png)]

3.优缺点

优点:

  • 基于内存运算,减少了硬盘 IO,计算更快。
  • 能够连接多个数据源,跨数据源连表查,如从 Hive 查询大量网站访问记录,然后从 MySQL 中匹配出设备信息。

缺点:Presto 能够处理 PB 级别的海量数据分析,但 Presto 并不是把 PB 级数据都放在内存中计算的。而是根据场景,如 Count,AVG 等聚合运算,是边读数据边计算,再清内存,再读数据再计算,这种耗的内存并不高。但是连表查,就可能产生大量的临时数据,因此速度会变慢。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O9HkIOyN-1651385753190)(.\20220502\图片1.png)]

4.优化
  • 合理设置分区:与Hive类似,Presto 会根据元数据信息读取分区数据,合理的分区能减少 Presto 数据读取量,提升查询性能。
  • 使用列式存储:Presto 对 ORC 文件读取做了特定优化,因此在 Hive 中创建 Presto 使用的表时,建议采用 ORC 格式存储。相对于Parquet,Presto 对 ORC 支持更好。
  • 使用压缩:数据压缩可以减少节点间数据传输对 IO 带宽压力,对于即席查询需要快速解压,建议采用 Snappy 压缩。
  • 只选择使用的字段:由于采用列示存储,选择需要的字段可以加快读取、减少数据量。
  • 过滤条件加上分区字段。
  • GROUP BY 代替 distinct。
  • Join 时大表放左边:Presto 中 join 的默认算法是 broadcast join,即将 join 的左表分割到多个 worker,然后将 join 右边的表数据整个复制一份发送到每个 worker 进行计算。如果右边的表数据量太大,则可能会报内存溢出错误。
5.注意
  • 和关键字冲突:MySQL 对字段加反引号 `、Presto 对字段加双引号。
  • 对于 Timestamp,需要进行比较的时候,需要添加 Timestamp 关键字,而 MySQL 中对 Timestamp 可以直接进行比较。例如 SELECT t FROM a WHERE t > timestamp '2017-01-01 00:00:00';
  • Presto 中不支持 insert overwrite 语法,只能先 delete,然后 insert into。
  • Presto目前支持 Parquet 格式,支持查询,但不支持 insert。