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

Jan*_*Jan 4 sql presto amazon-athena trino

Presto 有多个连接器。虽然连接器确实实现了读写操作,但从我读过的所有教程来看,它们似乎通常用作仅读取的数据源。例如,netflix在 Amazon S3 上有“10 PB”的数据,并且明确声明 Presto 工作节点上没有使用任何磁盘(也没有 HDFS)。所述用例是“临时交互式”查询。

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

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

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

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

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

小智 5

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

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

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

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

有了对输入数据的更多了解,您可以在 Alluxio 中实施数据策略,以 (1) 将数据(公共子查询)预加载到缓存空间中,(2) 设置 TTL 以从 Alluxio 缓存空间中淘汰数据,为其他热数据腾出空间, (3)对某些输入路径设置缓存策略(例如,对某些路径进行CACHE,对其他一些路径进行NO CACHE)。

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