为什么我的 Amazon Athena 查询运行时间很长?

上次更新日期:2021 年 3 月 30 日

我的 Amazon Athena 查询需要很长时间才能完成运行。查询排队时间很长。如何加快查询处理速度?

简短描述

Athena 是一项无服务器交互式查询服务。在您向 Athena 提交查询后,后端的资源池上将运行您的查询。这些资源由区域中的所有用户共享。您的查询可能会在短暂排队后才能运行。由于排队时间较长或引擎处理时间较长,查询通常需要很长时间才能运行。

解决方法

为您的查询 ID 调用 GetQueryExecution API。此 API 返回有关查询的单个处理的信息。这些信息包括有用的详细信息,示例如下:

查询排队花费的时间 (QueryQueueTimeInMillis) 查询计划花费的时间 (QueryPlanningTimeInMillis) 引擎处理时间 (EngineExecutionTimeInMillis)

此信息可在 API 响应的 Statistics (统计) 参数中查看。

由于后端资源紧张,您的查询排队的时间可能会延长。Athena 中的排队时间取决于资源分配。在您向 Athena 提交查询后,系统将根据以下信息分配资源来处理查询:

总体服务负载 传入请求数

如果查询的排队时间较长,请执行以下操作来提高查询性能:

    考虑在一段时间内分配查询。如果您批量提交查询,则可以增加提交次数并减少每批查询数量,而不应减少提交次数并增加每批查询数量。这可能会缩短查询处于 QUEUED(已排队)状态的时间,并减少总体查询处理时间。 不要同时运行一组复杂查询,而应运行简单查询与复杂查询的组合。此外,考虑先提交简单查询,再提交复杂查询。由于简单查询的处理速度很快,因此资源可以分配给复杂查询,而不会导致排队时间延长。 如果要在生成定期报告或加载新分区等情景中计划查询,请避免在小时时段开始时和小时时段过后 30 分钟计划查询。大多数自动化脚本和 Cron 作业都在这些时段内运行。因此,在这些时段内,服务负载通常会更高,从而增加排队时间。 如果您的使用案例允许,请在多个区域中运行查询。此举可以分布负载,帮助获取更多后端资源。这种方法可以缩短查询排队时间。
    重要提示:您可能会产生 Amazon Simple Storage Service (Amazon S3) 跨区域费用。

如果查询的引擎处理时间较长,请执行以下操作来提高查询性能:

    对表进行分区,以限制每个查询扫描的数据量。分区充当虚拟列,并根据列值将相关数据保存在一起。对表进行分区可以提高查询性能并降低成本。有关更多信息,请参阅对数据进行分区。 如果您查询的 Amazon S3 文件很小(通常小于 128MB),则查询处理时间可能会更长。打开 S3 文件、列出目录和设置数据传输等任务所涉及的开销导致时间增加。使用 Amazon EMR 上的 S3DistCp 实用工具将较小的 S3 文件合并为较大的对象。对象越大,需要的 Amazon S3 请求越少,从而缩短了查询处理时间。 执行其他存储和查询优化可以提高性能并缩短引擎处理时间。有关更多信息,请参阅 Amazon Athena 的十大性能优化技巧。

注意:您可以根据所在区域的默认查询相关配额同时向 Athena 提交多个查询。Athena 根据总体服务负载和传入请求数分配资源,以此处理查询。因此,您提交的所有查询可能无法同时运行。