Presto 是否开箱即用地在内部缓存中间结果?

Does Presto cache intermediate results internally out of the box?

Presto 有多个 connectors. While the connectors do implement read and write operations, from all the tutorials I read, it seems they are typically used as data sources to read from only. For example, netflix 在 Amazon S3 上有“10 PB”的数据,他们明确声明在 Presto 工作节点上没有使用磁盘(也没有 HDFS)。 所述用例是 "ad hoc interactive" 个查询。

此外,Amazon Athena 本质上是 S3+Presto,并且具有类似的用例。

我很困惑这在实践中如何运作。显然,您不希望每次查询都读取 10 PB 的数据。所以我假设,您想在内存中保留一些以前获取的数据,例如数据库索引。但是,由于对数据和查询没有限制,我无法理解这如何有效。

用例 1:我 运行 经常查询相同的内容,例如在仪表板上显示指标。 Presto 是否避免重新扫描已经 'known' 的数据点?

用例 2:我正在分析大型数据集。每个查询都略有不同,但是有共同的子查询,或者我们过滤到数据的共同子集。 Presto 是否从以前的查询中学习并继承中间结果?

或者,如果不是这种情况,是否建议我将中间结果存储在某处(例如 CREATE TABLE AS ...)?

据我所知,没有中间隐式缓存层。当您在集群上使用 HDFS 时,您肯定会受益于 OS 磁盘缓存,因此下一次查询 运行 会更快,但您不会获得即时缓存结果。类似的数据块级缓存也可能适用于 S3。

通常,没有一个合理大小的系统可以筛选 10 PB 的数据,因为读取所有这些数据会花费很多时间。但是,可以对数据进行分区,让 Presto 或多或少知道哪些数据需要扫描。当分区与查询条件一致时(例如,按数据对数据进行分区并查询最近的数据),这会非常有效。

当您的数据未按照查询方式进行分区,并且您不想以不同方式重新分区时,使用 create table ... as select 保存临时结果很有意义。您还可以使用一些内存存储来存储此类临时表,例如raptor(目前未记录)或 memory 连接器以实现更快的访问。

有关分区、调整存储和查询的一些入门技巧,您可以查看 https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/

Presto 本身没有数据缓存层。老实说,我认为您在这里提出的功能不应该由 Presto 作为 SQL 分析引擎提供。对于您提到的两个用例,我建议 deploying Alluxio together with Presto 作为缓存层来提供帮助:

Use case 1: I run the same query frequently, e.g. to show metric on a dashboard. Does Presto avoid rescanning the data points which are already 'known'?

作为缓存层,Alluxio 可以检测来自 Presto(或其他应用程序)的数据访问模式,并做出 caching/eviction 决策以提供内存层中最常用的数据(根据您的配置,可以也可以是 SSD 或 HDD)。当数据访问不一致时,这将有所帮助。

Use case 2: I'm analysing a large data set. Each query is slightly different, however there are common subqueries or we filter to a common subset of the data. Does Presto learn from previous queries and carry over intermediate results?

随着对输入数据的更多了解,您可以在 Alluxio 中执行数据策略以 (1) 将数据(公共子查询)预加载到缓存中 space,(2) 设置 TTL 以从 Alluxio 缓存中退出数据space 为其他热数据腾出空间,(3) 在特定输入路径上设置缓存策略(例如,在某些路径上缓存,在其他路径上不缓存)。

查看 运行 Presto/Alluxio 堆栈的更多提示:https://www.alluxio.io/blog/top-5-performance-tuning-tips-for-running-presto-on-alluxio-1/

改善 Presto 查询延迟的一个常见优化是缓存工作集以避免不必要的 I/O 来自远程数据源或通过慢速网络。本节介绍以下选项,以利用 Alluxio 作为 Presto 的缓存层。

Alluxio 文件系统将 Presto Hive 连接器作为独立的分布式缓存文件系统提供给 HDFS 或对象存储(如 AWS S3、GCP、Azure blob 存储)之上。用户可以通过文件系统接口了解缓存使用情况并显式控制缓存。例如,可以预加载 Alluxio 目录中的所有文件以预热 Presto 查询的缓存,并为缓存数据设置 TTL(time-to-live)以回收缓存容量。

Alluixo 结构化数据服务通过基于 Option1 的目录和缓存文件系统与 Presto 交互。此选项在选项 1 的基础上提供了额外的好处,可以无缝访问现有 Hive table,而无需修改 Hive Metastore 上的 table 位置,并通过合并许多小文件或转换输入文件的格式来进一步优化性能.

来源:Presto Alluxio Cache Service