我正在通过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万行和六列的列。
答案 0 :(得分:1)
通常,在Athena中运行并发查询的方式是根据需要运行任意数量的StartQueryExecution
调用,收集查询执行ID,然后对每个要完成的查询使用GetQueryExecution
进行轮询。雅典娜(Athena)独立,并发和异步地运行每个查询。
根据轮询每个查询执行ID之间的等待时间,查询可能会花费不同的时间。您可以使用来自Statistics.EngineExecutionTimeInMillis
的响应的GetQueryExecution
属性来查看查询在Athena中执行了多长时间,以及Status.SubmissionDateTime
和Status.CompletionDateTime
属性之间的差异以查看总计雅典娜收到查询到响应可用之间的时间。通常,这两个数字非常接近,如果有区别,您的查询会在Athena内部排队。
问题中的数字看起来不太可能。他们在连续跑了17秒钟后完全在同一秒结束,这似乎令人怀疑。您进行了几次实验?如果您查看Statistics.EngineExecutionTimeInMillis
,它们的毫秒数是否不同?还是所有数字都相同?您是否设置了ClientRequestToken
,并且是否对所有三个查询都设置了相同的值(在这种情况下,您实际上只运行了一个)。
“并行”是什么意思,是从不同的线程启动并轮询,还是在单个循环中轮询?您在每次轮询之间等待了多长时间?