为什么在从 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 数据源。
- 在 AWS Athena 控制台中进行查询时 - 一切正常
好的,提供结果,见截图:https://share.getcloudapp.com/NQuNBr5g
- 通过官方查询时API
应用程序域(使用 aws-sdk-php 供应商的 Symfony5 RESTful api),
查询甚至没有到达 Athena,返回的错误是 400:https://share.getcloudapp.com/xQuqQLrq
- 在 CloudTrail 事件中,我只能看到
errorcode= ThrottlingException and errormessage='Rate exceeded', 没有查询执行id.
- 奇怪的是,当我在 API 应用程序的本地主机设置中进行相同的调用时,调用再次成功:https://share.getcloudapp.com/jkuv8ZGy
发出的调用是 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 查询中获取数据。有助于始终如一地获得结果并且没有此错误的是:
- 更新 PHP SDK AthenaClient 构造函数,并为 retries.
传递配置
...其他 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
以相关方式对数据进行分区,以便扫描尽可能少的数据。这有助于获得更一致和更快的结果。 - https://docs.aws.amazon.com/athena/latest/ug/partitions.html // 直接在 glue table 上,或者通过指定分区键的 Glue ETL 作业。如果您在 athena 上的查询正在寻找 country={country} 的内容,那么一个好的分区方案是按国家/地区划分的。
避免 'select *' - 始终准确命名所需的列+添加限制+在 Athena 上的查询应该相对简单 select 查询,如果您需要连接或其他更复杂的查询类型,Redshift 更适合。
我们在 AWS 中有一个 S3 数据湖(带有 Lake Formation、Glue 等)。最终目标是使用 Athena 中的 SQL 查询 S3 数据源。
- 在 AWS Athena 控制台中进行查询时 - 一切正常 好的,提供结果,见截图:https://share.getcloudapp.com/NQuNBr5g
- 通过官方查询时API
应用程序域(使用 aws-sdk-php 供应商的 Symfony5 RESTful api),
查询甚至没有到达 Athena,返回的错误是 400:https://share.getcloudapp.com/xQuqQLrq
- 在 CloudTrail 事件中,我只能看到 errorcode= ThrottlingException and errormessage='Rate exceeded', 没有查询执行id.
- 奇怪的是,当我在 API 应用程序的本地主机设置中进行相同的调用时,调用再次成功:https://share.getcloudapp.com/jkuv8ZGy
发出的调用是 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 查询中获取数据。有助于始终如一地获得结果并且没有此错误的是:
- 更新 PHP SDK AthenaClient 构造函数,并为 retries. 传递配置
...其他 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
以相关方式对数据进行分区,以便扫描尽可能少的数据。这有助于获得更一致和更快的结果。 - https://docs.aws.amazon.com/athena/latest/ug/partitions.html // 直接在 glue table 上,或者通过指定分区键的 Glue ETL 作业。如果您在 athena 上的查询正在寻找 country={country} 的内容,那么一个好的分区方案是按国家/地区划分的。
避免 'select *' - 始终准确命名所需的列+添加限制+在 Athena 上的查询应该相对简单 select 查询,如果您需要连接或其他更复杂的查询类型,Redshift 更适合。