【发布时间】:2021-07-02 02:40:45
【问题描述】:
我的平台在 gcp 云上运行。我们使用的数据库是雪花。
每周一次,我们安排(使用 Cloud Schedule)一个实际上触发多达 200 个任务的作业(目前,将来可能会增长)。所有任务都被添加到某个队列中。
每个任务实际上都是将调用后推送到云运行实例。
每个云运行实例都在处理一个请求(另请参阅环境设置),这意味着 - 一次执行一项任务。此外,每个云运行都有 2 个活动会话,连接到雪花中的 2 个数据库(每个数据库一个)。第一个会话用于“global_db”,另一个会话用于特定的“person_id”数据库(注意:来自不同云运行实例的同一 person_id 数据库可能有 2 个活动会话)
问题:
1 - 将任务队列“最大并发调度”设置为 1000 时,我得到 503(“请求失败,因为实例未通过就绪检查。”) 问题可能是 gcp 自动缩放能力 - 已解决,方法是将“最大并发调度”降低到 gcp 可以处理的合理数量。
2- 将任务队列“Max concurrent dispatches”设置为 10 以上时, 我收到多个 ConnectTimeoutError 和 OperationalError,并带有以下消息(我删除了长 ID 并只放了 {} 以使消息更短):
sqlalchemy.exc.OperationalError: (snowflake.connector.errors. ) 250003: Failed to execute request: HTTPSConnectionPool(host='*****.us-central1.gcp.snowflakecomputing.com', port=443): Max retries exceeded with url: /session/v1/login-request?request_id={REQUEST_ID}&databaseName={DB_NAME}&warehouse={NAME}&request_guid={GUID} (Caused by ConnectTimeoutError(<snowflake.connector.vendored.urllib3.connection.HTTPSConnection object at 0x3e583ff91550>, 'Connection to *****.us-central1.gcp.snowflakecomputing.com timed out. (connect timeout=60)'))
(此错误的背景:http://sqlalche.me/e/13/e3q8)
snowflake.connector.vendored.urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='*****.us-central1.gcp.snowflakecomputing.com', port=443): Max retries exceeded with url: /session/v1/login-request?request_id={ID}&databaseName={NAME}&warehouse={NAME}&request_guid={GUID}(Caused by ConnectTimeoutError(<snowflake.connector.vendored.urllib3.connection.HTTPSConnection object at 0x3eab877b3ed0>, 'Connection to *****.us-central1.gcp.snowflakecomputing.com timed out. (connect timeout=60)'))
有什么想法可以解决吗? 问你有什么问题,我会详细说明
环境设置 -
- 云任务队列 - 检查“最大并发调度”的多个配置,从 10 到 1000 并发。最大尝试次数为 1,最大分派次数为 500。
- 云运行 - 5 个热实例,每个实例 1 个请求。可以自动扩展至最多 1000 个实例。
- snowflake - ACCOUNT 参数是默认的(MAX_CONCURRENCY_LEVEL=8 和 STATEMENT_QUEUED_TIMEOUT_IN_SECONDS=0)并更改为(为了处理这些错误):
- MAX_CONCURRENCY_LEVEL - 32
- STATEMENT_QUEUED_TIMEOUT_IN_SECONDS - 600
【问题讨论】:
-
如果“Max concurrent dispatches”小于10,效果好吗?
-
是的,我用 5 试过了,效果很好
-
该错误表明您的登录请求超时,因此您甚至没有达到运行查询的阶段。由于它的工作时间不到 10 个,我正在考虑来自云端的一些限制/并发。
-
你的意思是 gcp 还是雪花?
-
我认为是 GCP,但很难说。在 Snowflake 方面,您甚至没有达到使用 MAX_CONCURRENCY_LEVEL 因为您仍在登录请求中,所以从我的角度来看,这不是 Snowflake 的并发问题。另一方面,我不会触及 MAX_CONCURRENCY_LEVEL。当您达到 MAX_CONCURRENCY_LEVEL 查询被排队,而不是被丢弃,所以这个参数肯定不是这里的原因。
标签: google-cloud-platform snowflake-cloud-data-platform google-cloud-run google-cloud-tasks