绩效改进的关键关注领域 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

绩效改进的关键关注领域

Trino 最大限度地提高了查询并行度和内存优化。该架构允许其在高效扩展的同时查询多个不同的数据源,从而提供了灵活性。Trino 性能改进的关键领域包括下面列出的领域。

内存优化

Trino 中的内存管理对于实现高性能和稳定性至关重要,尤其是在运行大型复杂查询时。Trino 使用分布式内存模型。在此模型中,内存是在工作节点之间分配的,用于处理任务、聚合、联接和其他操作。以下列表介绍了这些设置的集合:

  • query.max-mem ory — 设置整个集群中单个查询可用的最大内存。这是一个硬限制;如果查询超过此内存,它将失败。

  • 查询。 max-memory-per-node— 定义查询在每个工作节点上可以消耗的最大内存。设置此项可确保任何查询都不会垄断任何工作程序的资源。

  • JVM 堆大小 — 在 JVM 级别进行配置,它设置每个节点上 Trino 服务器进程的最大堆大小。此值通常应大于与内存相关的配置(这是查询的总和。 max-memory-per-node记忆。 heap-headroom-per-node) 在 Trino 中以避免系统在 JVM 级别耗尽内存。

  • 记忆。 heap-headroom-per-node— 指定要从非查询操作的 JVM 堆大小中省略的缓冲区内存量。这对于确保内部操作和垃圾收集有足够的开销至关重要。

动态过滤

Trino 中的动态筛选是一种优化技术,它通过减少处理的数据量(尤其是在联接期间)来提高查询性能。它根据联接一侧看到的数据,动态应用筛选条件来限制联接一侧扫描的数据,这在联接一侧具有高度选择性(这意味着它包含一小部分数据)的查询中特别有用。它在 Amazon EMR 上默认处于启用状态。以下是查询示例:

SELECT orders.order_id, orders.total_amount FROM orders JOIN customers ON orders.customer_id = customers.customer_id WHERE customers.country = 'France';

如果不进行动态筛选,Trino会以联接方式扫描整个订单表,即使只有一小部分客户(来自法国的客户)有相关性。这种方法会读取订单表中的所有行,从而导致较高的 I/O 和处理成本。通过动态筛选,Trino 首先会扫描较小的客户表,仅检索来自法国的客户的 customer_id 值,然后将此子集作为筛选条件应用于订单。这意味着仅扫描订单中的相关行(customer_id 与筛选后的子集相匹配的行),从而大大减少了处理的记录。

溢出到磁盘

在 Trino 中,磁盘溢出允许将中间查询结果卸载到磁盘,从而使内存密集型查询能够完成,即使这些查询超过了或设置的内存限制。query_max_memory query_max_memory_per_node默认情况下,Trino 强制执行这些限制是为了确保公平的内存分配并防止集群死锁。但是,当大型查询超过这些限制时,就有可能终止。磁盘溢出通过使用来解决这个问题revocable memory,允许查询借用额外的内存,如果其他地方需要资源,可以撤消这些内存。当内存被撤消时,中间数据会溢出到磁盘,从而使查询能够在不超过内存限制的情况下继续处理。请注意,强制溢出到磁盘的查询的执行时间可能会更长,因此默认情况下处于禁用状态。要在 Amazon EMR 上启用泄漏功能,请使用以下配置:

  • spill-enabled=true— 当内存使用量超过可用阈值时,启用磁盘溢出。

  • spill-paths— 定义存储溢出数据的目录,spill-paths=/mnt/spill