【问题标题】:How to make Athena process multiple queries concurrently如何让 Athena 同时处理多个查询
【发布时间】:2019-04-15 15:08:03
【问题描述】:

我正在通过 Python 应用程序向 Athena 发起多个并发查询。

鉴于 Athena 的查询历史,似乎 Athena 确实同时接收到多个查询,并同时处理。

但是,事实证明,总体查询运行时间与一个接一个地发送查询并没有太大区别。

示例:顺序发送三个查询与同时发送:

# sequentially
           received at       took      finished at
query_1       22:01:14         6s         22:01:20
query_2       22:01:20         6s         22:01:27
query_3       22:01:27         5s         22:01:25

# concurrently
           received at       took      finished at
query_1       22:02:25        17s         22:02:42
query_2       22:02:25        17s         22:02:42
query_3       22:02:25        17s         22:02:42

根据这些结果,在第二种情况下,似乎 Athena 虽然假装同时处理查询,但以顺序方式有效地处理它们。

是否有一些我不知道的配置,以使 Athena 有效地同时处理多个查询?理想情况下,在本例中,三个查询并发处理的全局运行时间为 6 秒(三个单独查询中最长的时间)。

注意:这是三个针对同一个数据库/表的查询,由 S3 中的同一个(单个)Parquet 文件支持。这个 Parquet 文件大约是。 70Mb 大,250 万行,六列。

【问题讨论】:

  • Athena 将同时运行查询,您看到的数字不太可能是 Athena 造成的。要弄清楚它是什么,你必须给我们更多的上下文,例如你用来产生测量的代码。您如何等待查询完成?
  • @Theo 感谢您的评论 — 这些数字直接来自 Athena 的查询历史记录,而不是来自我的系统。
  • 向我们展示启动查询的代码以及从查询历史记录中提取数字的代码。当我们谈论 17 秒运行时,三个查询看起来不太可能具有确切的开始和结束持续时间。我们运行了数百个并发查询,但没有看到这种行为。

标签: concurrency amazon-athena


【解决方案1】:

通常,您在 Athena 中运行并发查询的方式是根据需要运行尽可能多的 StartQueryExecution 调用,收集查询执行 ID,然后使用 GetQueryExecution 轮询要完成的每个调用。 Athena 独立、并发和异步运行每个查询。

根据轮询每个查询执行 ID 之间等待的时间长短,查询可能需要不同的时间。您可以使用来自GetQueryExecution 的响应的Statistics.EngineExecutionTimeInMillis 属性来查看查询在Athena 中执行的时间,以及Status.SubmissionDateTimeStatus.CompletionDateTime 属性之间的差异来查看Athena 收到查询和当响应可用时。通常这两个数字非常接近,如果有差异,您的查询会在 Athena 内部排队。

您问题中的数字看起来不太可能。他们在跑了 17 秒后在同一秒结束,这看起来很可疑。您进行了多少次实验?如果您查看Statistics.EngineExecutionTimeInMillis,它们的毫秒数是否不同,或者所有数字都相同?您是否设置了ClientRequestToken,如果设置了,那么所有三个查询的值是否相同(在这种情况下,您实际上只运行了一个)。

你所说的“并发”是什么意思,你是从不同的线程开始和轮询,还是在一个循环中轮询?您在每次投票电话之间等待了多长时间?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    相关资源
    最近更新 更多