为什么在从 API 服务器发出 AWS Athena API 调用时出现 ThrottlingException - Rate Exceeded status:400?

Why do I get ThrottlingException - Rate Exceeded status:400 when making AWS Athena API call from API server?

我们在 AWS 中有一个 S3 数据湖(带有 Lake Formation、Glue 等)。最终目标是使用 Athena 中的 SQL 查询 S3 数据源。

发出的调用是 Athena API 上的 StartQueryExecution,API 应用端显示的错误:

Error executing \"GetQueryExecution\" on \"https://athena.us-west-2.amazonaws.com\"; AWS HTTP error: Client error: `POST https://athena.us-west-2.amazonaws.com` resulted in a `400 Bad Request` response:\n{\"__type\":\"ThrottlingException\",\"message\":\"Rate exceeded\"}\n ThrottlingException (client): Rate exceeded - {\"__type\":\"ThrottlingException\",\"message\":\"Rate exceeded\"}", "class": "Aws\Athena\Exception\AthenaException"

API 应用服务器和数据湖等在同一个 VPC 上,我创建了一个从服务器的 VPC 到 athena us-west-2 端点的 VPC 端点,但它没有帮助。我不认为这是雅典娜配额问题,因为在本地主机上查询工作得很好。任何见解都会非常有帮助,谢谢!

解决方案是综合行动。雅典娜不是那样工作的。因此,不能像查询关系数据库那样期望通过 S3 数据湖从 Athena 查询中获取数据。有助于始终如一地获得结果并且没有此错误的是:

  1. 更新 PHP SDK AthenaClient 构造函数,并为 retries.
  2. 传递配置

...其他 AthenaClient 构造函数参数...

'retries' => [
'mode' => 'standard',
'max_attempts' => 3
],
  • Athena 和其他弹性服务(例如 dynamodb)异步工作。您发出查询,但结果不会同步传递。例如——我在早期的测试中看到总是收到初始的“throttlingException”,但在 Athena 查询控制台中,完全相同的查询的结果稍晚出现,但成功了。看起来 aws 的 PHP SDK 是考虑到这一点的,所以重试和指数退避也是 AWS 推荐的:https://docs.aws.amazon.com/general/latest/gr/api-retries.html
  1. 以相关方式对数据进行分区,以便扫描尽可能少的数据。这有助于获得更一致和更快的结果。 - https://docs.aws.amazon.com/athena/latest/ug/partitions.html // 直接在 glue table 上,或者通过指定分区键的 Glue ETL 作业。如果您在 athena 上的查询正在寻找 country={country} 的内容,那么一个好的分区方案是按国家/地区划分的。

  2. 避免 'select *' - 始终准确命名所需的列+添加限制+在 Athena 上的查询应该相对简单 select 查询,如果您需要连接或其他更复杂的查询类型,Redshift 更适合。