google-cloud-spanner - 无法从 Spanner 中删除大量行
问题描述
我有 3 个节点 Spanner 实例和一个包含大约 40 亿行的表。DDL 如下所示:
CREATE TABLE predictions (
name STRING(MAX),
...,
model_version INT64,
) PRIMARY KEY (name, model_version)
我想设置一个作业,使用 Python Spanner 客户端定期从该表中删除一些旧行。我想运行的查询是:
DELETE FROM predictions WHERE model_version <> ?
根据文档,听起来我需要将其作为分区 DML语句执行。我正在使用 Python Spanner 客户端,如下所示,但504 Deadline Exceeded
由于我的表中有大量行,我遇到了超时(错误)。
# this always throws a "504 Deadline Exceeded" error
database.execute_partitioned_dml(
"DELETE FROM predictions WHERE model_version <> @version",
params={"model_version": 104},
param_types={"model_version": Type(code=INT64)},
)
我的第一个直觉是看看是否可以增加某种超时,但我在源代码中看不到任何超时参数:/
我确实注意到run_in_transaction
Spanner 库中有一个包含超时参数的方法,因此我决定偏离分区 DML 方法,看看使用此方法是否有效。这是我跑的:
def delete_old_rows(transaction, model_version):
delete_dml = "DELETE FROM predictions WHERE model_version <> {}".format(model_version),
dml_statements = [
delete_dml,
]
status, row_counts = transaction.batch_update(dml_statements)
database.run_in_transaction(delete_old_rows,
model_version=104,
timeout_secs=3600,
)
奇怪的是这个timeout_secs
参数似乎被忽略了,因为504 Deadline Exceeded
尽管超时一小时,我仍然在执行上述代码的一两分钟内得到一个错误。
无论如何,我不太确定接下来要尝试什么,或者我是否遗漏了一些明显的东西,可以让我在这个巨大的 Spanner 表上及时运行删除查询。该model_version
列的基数非常低(整个表中通常有 2-3 个唯一model_version
值),所以我不确定这是否会影响任何建议。但是,如果有人可以提供一些建议或建议,那就太棒了:) 提前致谢
解决方案
设置 timeout_secs 没有帮助的原因是因为该参数不幸不是事务的超时。这是事务的重试超时,因此它用于设置事务将停止重试的截止日期。
我们将更新 run_in_transaction 的文档以更好地解释这一点。
推荐阅读
- node.js - Express JS 在不关闭服务器的情况下清除内存的方法?
- r - ggplot2:添加第二个不同比例的 y 轴
- java - 所有这些不同的版本告诉我什么?
- airflow - 如何修复错误“AirflowException(“作业运行者的主机名不匹配”)”?
- linux - 如何修复 Dockerfile 中导致“无法执行二进制文件”错误的管道到 shell
- c# - ASP.NET - 模型对象列表的 API Url
- java - 没有 JRE 的新 JDK 12?这是如何运作的?
- c# - 为什么反序列化的 JSON 数组返回 null?
- javascript - 跨 DIN A4 页面拆分文本
- javascript - 反应中的电子邮件编码和基本身份验证