429 Client Error: TooManyRequests for url
429 Client Error: TooManyRequests for url
我有一个脚本可以在一定时间内执行摄取语句。简化的方式如下所示:
import time
from azure.kusto.data import KustoClient, KustoConnectionStringBuilder, ClientRequestProperties
cluster = "https://<adxname>.centralus.kusto.windows.net"
client_id = "<sp_guid>"
client_secret = "<sp_secret>"
authority_id = "<tenant_guid>"
db = "db-name"
kcsb = KustoConnectionStringBuilder.with_aad_application_key_authentication(
cluster, client_id, client_secret, authority_id)
client = KustoClient(kcsb)
query = """
.append my_table <|
another_table | where ... | summarize ... | project ...
"""
while True:
client.execute(db, query)
time.sleep(30.0)
因此它每 30 秒执行一次小查询。查询只需几毫秒即可完成。库版本:azure-kusto-data==3.1.0
.
它在一段时间内工作正常,但一段时间后它开始失败并出现以下错误:
requests.exceptions.HTTPError: 429 Client Error: TooManyRequests for
url:
https://adxname.centralus.kusto.windows.net/v1/rest/mgmt
azure.kusto.data.exceptions.KustoApiError: The control command was
aborted due to throttling. Retrying after some backoff might succeed.
CommandType: 'TableAppend', Capacity: 1, Origin:
'CapacityPolicy/Ingestion'.
查看错误中提到的 CapacityPolicy/Ingestion,我看不出它有什么相关性。此策略保留为默认值:
.show cluster policy capacity
"Policy": {
"IngestionCapacity": {
"ClusterMaximumConcurrentOperations": 512,
"CoreUtilizationCoefficient": 0.75
},
...
}
我不太明白它与并发操作或核心利用率有什么关系,因为摄取速度很快而且很少执行。
如何解决问题?
根据错误消息,您的集群的摄取容量为 1。这可能表明您正在使用具有 2 个核心的单个节点的开发 SKU。
使用这样的设置,在给定时间只能进行一次摄取操作 运行。任何额外的并发摄取都将受到限制。
您可以对摄取到集群中的客户端实施更严格的控制,以便不超过一个摄取命令同时尝试 运行,并且调用代码可以从节流错误中恢复;或扩展集群 up/out - 通过添加更多 nodes/cores 您将增加摄取容量。
您还可以使用 .show commands
验证 who/what else 是否正在摄取您的集群
假设您对数据库具有监控或管理员权限,您可以运行以下内容以查看任何给定时间段内的摄取activity(确保您在“在”子句中),例如:
.show commands
| where StartedOn > ago(1h)
| where CommandType in ("DataIngestPull", "TableAppend", "TableSetOrReplace", "TableSetOrAppend")
| summarize count() by CommandType
附带说明,对于此类操作,您应该考虑使用 materialized views。
我有一个脚本可以在一定时间内执行摄取语句。简化的方式如下所示:
import time
from azure.kusto.data import KustoClient, KustoConnectionStringBuilder, ClientRequestProperties
cluster = "https://<adxname>.centralus.kusto.windows.net"
client_id = "<sp_guid>"
client_secret = "<sp_secret>"
authority_id = "<tenant_guid>"
db = "db-name"
kcsb = KustoConnectionStringBuilder.with_aad_application_key_authentication(
cluster, client_id, client_secret, authority_id)
client = KustoClient(kcsb)
query = """
.append my_table <|
another_table | where ... | summarize ... | project ...
"""
while True:
client.execute(db, query)
time.sleep(30.0)
因此它每 30 秒执行一次小查询。查询只需几毫秒即可完成。库版本:azure-kusto-data==3.1.0
.
它在一段时间内工作正常,但一段时间后它开始失败并出现以下错误:
requests.exceptions.HTTPError: 429 Client Error: TooManyRequests for url: https://adxname.centralus.kusto.windows.net/v1/rest/mgmt
azure.kusto.data.exceptions.KustoApiError: The control command was aborted due to throttling. Retrying after some backoff might succeed. CommandType: 'TableAppend', Capacity: 1, Origin: 'CapacityPolicy/Ingestion'.
查看错误中提到的 CapacityPolicy/Ingestion,我看不出它有什么相关性。此策略保留为默认值:
.show cluster policy capacity
"Policy": {
"IngestionCapacity": {
"ClusterMaximumConcurrentOperations": 512,
"CoreUtilizationCoefficient": 0.75
},
...
}
我不太明白它与并发操作或核心利用率有什么关系,因为摄取速度很快而且很少执行。
如何解决问题?
根据错误消息,您的集群的摄取容量为 1。这可能表明您正在使用具有 2 个核心的单个节点的开发 SKU。
使用这样的设置,在给定时间只能进行一次摄取操作 运行。任何额外的并发摄取都将受到限制。
您可以对摄取到集群中的客户端实施更严格的控制,以便不超过一个摄取命令同时尝试 运行,并且调用代码可以从节流错误中恢复;或扩展集群 up/out - 通过添加更多 nodes/cores 您将增加摄取容量。
您还可以使用 .show commands
假设您对数据库具有监控或管理员权限,您可以运行以下内容以查看任何给定时间段内的摄取activity(确保您在“在”子句中),例如:
.show commands
| where StartedOn > ago(1h)
| where CommandType in ("DataIngestPull", "TableAppend", "TableSetOrReplace", "TableSetOrAppend")
| summarize count() by CommandType
附带说明,对于此类操作,您应该考虑使用 materialized views。