如何使Athena同时处理多个查询

时间:2019-04-15 15:08:04

标签: concurrency amazon-athena

我正在通过Python应用程序向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有效地并发处理多个查询?理想情况下,在此示例中,同时处理的三个查询将花费6s的全局运行时间(三个单独查询中的最长时间)。

注意:这是三个针对相同数据库/表的查询,这些查询由S3中相同(单个)的Parquet文件支持。这个木地板文件是大约。大小为70Mb,并具有250万行和六列的列。

1 个答案:

答案 0 :(得分:1)

通常,在Athena中运行并发查询的方式是根据需要运行任意数量的StartQueryExecution调用,收集查询执行ID,然后对每个要完成的查询使用GetQueryExecution进行轮询。雅典娜(Athena)独立,并发和异步地运行每个查询。

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

问题中的数字看起来不太可能。他们在连续跑了17秒钟后完全在同一秒结束,这似乎令人怀疑。您进行了几次实验?如果您查看Statistics.EngineExecutionTimeInMillis,它们的毫秒数是否不同?还是所有数字都相同?您是否设置了ClientRequestToken,并且是否对所有三个查询都设置了相同的值(在这种情况下,您实际上只运行了一个)。

“并行”是什么意思,是从不同的线程启动并轮询,还是在单个循环中轮询?您在每次轮询之间等待了多长时间?