Amazon web services AWS雅典娜对api来说太慢了?

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的后端,但这当然取决于它是什

计划是从aws数据交换中获取数据,将其移动到s3存储桶中,然后由aws athena查询数据api。一切正常,只是感觉有点慢

无论是数据集还是查询,雅典娜的响应时间都不能低于2秒。这对于一个API来说太多了。我检查了最佳实践,但似乎也超过了2秒

因此,我的问题是: 2秒是雅典娜的最短响应时间吗


如果是这样的话,那么我必须切换到postgres。

雅典娜确实不是一个低延迟的数据存储。您很少会看到响应时间低于1秒,而且通常会相当长。在一般情况下,Athena不适合作为API的后端,但这当然取决于它是什么类型的API。如果它是某种分析服务,用户可能不希望响应时间达到亚秒?我已经构建了使用Athena的API,这些API工作得非常好,但这些服务的响应时间预计为秒(甚至被认为是很快的),我从Athena团队那里得到了帮助,使我们的帐户适应我们的工作负载

为了理解雅典娜“慢”的原因,我们可以剖析当您向雅典娜提交查询时会发生什么:

  • 代码通过使用
    startqueryexecute
    API调用启动查询
  • Athena服务接收查询,并将其放入队列中。如果您运气不好,您的查询将在队列中等待一段时间
  • 当有可用容量时,Athena服务将从队列中接收您的查询并制定查询计划
  • 查询计划要求为查询中包含的所有表从Glue目录(包括分区列表)加载表元数据
  • Athena还列出了它从表和分区获得的S3上的所有位置,以生成将要处理的文件的完整列表
  • 然后,根据计划的复杂性,分多个步骤并行执行计划
  • 并行执行的结果被合并,结果被序列化为CSV并写入S3
  • 同时,您的代码使用
    GetQueryExecution
    API调用检查查询是否已完成,直到它得到一个表示执行已成功、失败或已取消的响应
  • 如果执行成功,代码将使用
    GetQueryResults
    API调用检索结果的第一页
  • 为了响应该API调用,Athena从S3读取结果CSV,对其进行反序列化,并将其序列化为API响应的JSON
  • 如果超过1000行,则重复最后的步骤
  • 普雷斯托专家可能会给出更多关于步骤4-6的细节,尽管在雅典娜版本的普雷斯托中它们可能有一些修改。不过,细节对于本次讨论并不重要

    如果您对大量数据(数十GB或更多)运行查询,那么总执行时间将由步骤6决定。如果结果也很大,7将是一个因素

    如果您的数据集很小,并且/或者涉及S3上的数千个文件,那么4-5将占据主导地位

    以下是为什么Athena查询永远不会很快,即使它们不会触及S3(例如
    SELECT NOW()
    ):

    • 在得到响应之前,至少会有三个API调用,一个是
      StartQueryExecution
      ,一个是
      GetQueryExecution
      ,一个是
      GetQueryResults
      ,只是它们的往返时间(RTT)加起来会超过100ms
    • 您很可能需要多次调用
      GetQueryExecution
      ,调用之间的延迟将限制您发现查询成功的速度,例如,如果您每100毫秒调用一次,您将平均在总时间中增加100毫秒+RTT的一半,因为平均而言,您将错过如此多的实际完成时间
    • Athena将在将执行标记为成功之前将结果写入S3,因为它生成一个CSV文件,所以这不是并行完成的。写一个大的回应需要时间
    • GetQueryResults
      必须从S3读取CSV,解析它并将其序列化为JSON。后续页面必须在CSV中提前跳过,并且可能会更慢
    • Athena是一个多租户服务,所有客户都在争夺资源,当没有足够的可用资源时,您的查询将排队
    如果您想知道什么会影响查询的性能,可以使用
    ListQueryExecutions
    API调用列出最近的查询执行ID(我认为最多可以追溯到90天),然后使用
    GetQueryExecution
    获取查询统计信息(请参阅每个属性的含义)。通过这些信息,您可以确定查询速度慢是因为排队、执行还是API调用的开销(如果不是前两个,很可能是最后一个)

    您可以做一些事情来减少一些延迟,但这些提示不太可能让您降低到亚秒延迟:

    • 如果您查询大量数据,请使用针对这类内容优化的文件格式,Parquet几乎总是答案——同时确保您的文件大小是最佳的,大约为100 MB
    • 避免大量文件,避免深层层次结构。理想情况下,每个分区只有一个或几个文件,并且不要在“子目录”(带斜杠的S3前缀)中组织文件,除了那些对应于分区的文件
    • 避免在最忙的时候运行查询,这是当其他所有人的计划作业都在运行时,在每小时的头几分钟都会有大量的资源争用
    • 跳过GetQueryExecution,直接从S3下载CSV。如果您想知道列的数据类型,则
      GetQueryExecution
      调用很方便,但是如果您已经知道或不在乎,直接读取数据可以节省宝贵的几十毫秒。如果需要列数据类型,可以