Amazon web services AWS雅典娜对api来说太慢了?
计划是从aws数据交换中获取数据,将其移动到s3存储桶中,然后由aws athena查询数据api。一切正常,只是感觉有点慢 无论是数据集还是查询,雅典娜的响应时间都不能低于2秒。这对于一个API来说太多了。我检查了最佳实践,但似乎也超过了2秒 因此,我的问题是: 2秒是雅典娜的最短响应时间吗Amazon web services AWS雅典娜对api来说太慢了?,amazon-web-services,amazon-athena,Amazon Web Services,Amazon Athena,计划是从aws数据交换中获取数据,将其移动到s3存储桶中,然后由aws athena查询数据api。一切正常,只是感觉有点慢 无论是数据集还是查询,雅典娜的响应时间都不能低于2秒。这对于一个API来说太多了。我检查了最佳实践,但似乎也超过了2秒 因此,我的问题是: 2秒是雅典娜的最短响应时间吗 如果是这样的话,那么我必须切换到postgres。雅典娜确实不是一个低延迟的数据存储。您很少会看到响应时间低于1秒,而且通常会相当长。在一般情况下,Athena不适合作为API的后端,但这当然取决于它是什
如果是这样的话,那么我必须切换到postgres。雅典娜确实不是一个低延迟的数据存储。您很少会看到响应时间低于1秒,而且通常会相当长。在一般情况下,Athena不适合作为API的后端,但这当然取决于它是什么类型的API。如果它是某种分析服务,用户可能不希望响应时间达到亚秒?我已经构建了使用Athena的API,这些API工作得非常好,但这些服务的响应时间预计为秒(甚至被认为是很快的),我从Athena团队那里得到了帮助,使我们的帐户适应我们的工作负载 为了理解雅典娜“慢”的原因,我们可以剖析当您向雅典娜提交查询时会发生什么:
startqueryexecute
API调用启动查询GetQueryExecution
API调用检查查询是否已完成,直到它得到一个表示执行已成功、失败或已取消的响应GetQueryResults
API调用检索结果的第一页SELECT NOW()
):
- 在得到响应之前,至少会有三个API调用,一个是
,一个是StartQueryExecution
,一个是GetQueryExecution
,只是它们的往返时间(RTT)加起来会超过100msGetQueryResults
- 您很可能需要多次调用
,调用之间的延迟将限制您发现查询成功的速度,例如,如果您每100毫秒调用一次,您将平均在总时间中增加100毫秒+RTT的一半,因为平均而言,您将错过如此多的实际完成时间GetQueryExecution
- Athena将在将执行标记为成功之前将结果写入S3,因为它生成一个CSV文件,所以这不是并行完成的。写一个大的回应需要时间
必须从S3读取CSV,解析它并将其序列化为JSON。后续页面必须在CSV中提前跳过,并且可能会更慢GetQueryResults
- Athena是一个多租户服务,所有客户都在争夺资源,当没有足够的可用资源时,您的查询将排队
ListQueryExecutions
API调用列出最近的查询执行ID(我认为最多可以追溯到90天),然后使用GetQueryExecution
获取查询统计信息(请参阅每个属性的含义)。通过这些信息,您可以确定查询速度慢是因为排队、执行还是API调用的开销(如果不是前两个,很可能是最后一个)
您可以做一些事情来减少一些延迟,但这些提示不太可能让您降低到亚秒延迟:
- 如果您查询大量数据,请使用针对这类内容优化的文件格式,Parquet几乎总是答案——同时确保您的文件大小是最佳的,大约为100 MB
- 避免大量文件,避免深层层次结构。理想情况下,每个分区只有一个或几个文件,并且不要在“子目录”(带斜杠的S3前缀)中组织文件,除了那些对应于分区的文件
- 避免在最忙的时候运行查询,这是当其他所有人的计划作业都在运行时,在每小时的头几分钟都会有大量的资源争用
- 跳过GetQueryExecution,直接从S3下载CSV。如果您想知道列的数据类型,则
调用很方便,但是如果您已经知道或不在乎,直接读取数据可以节省宝贵的几十毫秒。如果需要列数据类型,可以GetQueryExecution