Dataform间歇性创建外部表失败问题排查求助
Dataform间歇性创建外部表失败问题排查求助
我最近在Dataform里实现自动创建BigQuery外部表的逻辑时,碰到了一个特别棘手的间歇性问题,折腾好几天都没摸到根源,想在这里求助下各位大佬的思路。
问题背景
我通过Dataform的SQLX文件调用自定义JavaScript函数来生成创建外部表的逻辑,明明已经在创建前加上了DROP TABLE IF EXISTS的操作,但还是会时不时抛出Already Exists: Table vas-us-east4:external_source.sessionizer_hourly_audience_deal_reporting_metaaudiences at [2:11]的报错。更离谱的是,就算我手动提前删掉目标表,执行的时候依然可能触发这个错误,而且这个问题不是必现的,有时候运行又完全正常。
我的实现细节
1. SQLX配置文件
config { type: "operations", tags: ["soma_deal_meta_audience_reporting_pipeline"] } ${operations.createSessionizerTable("sessionizer_hourly_audience_deal_reporting_metaaudiences")}
2. JavaScript创建表函数
createSessionizerTable: (name, datetime) => { if (!name) { throw new Error("createSessionizerTable requires a table name."); } const report_datetime_logic = datetime ? `TIMESTAMP("${datetime}")` : `TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)`; const prefix = getEnvPrefix(); const schema = `${prefix}${dataform.projectConfig.vars.external_source_schema}`; return ` BEGIN DECLARE report_datetime TIMESTAMP DEFAULT ${report_datetime_logic}; DECLARE year STRING DEFAULT FORMAT_TIMESTAMP('%Y', report_datetime); DECLARE month STRING DEFAULT FORMAT_TIMESTAMP('%m', report_datetime); DECLARE day STRING DEFAULT FORMAT_TIMESTAMP('%d', report_datetime); DECLARE hour STRING DEFAULT FORMAT_TIMESTAMP('%H', report_datetime); EXECUTE IMMEDIATE (FORMAT(""" DROP TABLE IF EXISTS \`${dataform.projectConfig.vars.projectName}.${schema}.${name}\` """)); EXECUTE IMMEDIATE (FORMAT(""" CREATE OR REPLACE EXTERNAL TABLE \`${dataform.projectConfig.vars.projectName}.${schema}.${name}\` OPTIONS ( format = 'PARQUET', uris = ['${dataform.projectConfig.vars.sessionizer_gcs_bucket}/category=logs/year=%s/month=%s/day=%s/hour=%s/*.parquet'] ); """, year, month, day, hour)); END; `; },
已做的排查动作
- 反复核对了
DROP TABLE和CREATE语句中的表名,确认完全一致,没有拼写错误; - 手动执行生成的完整SQL,大部分时候能成功,但偶尔也会复现同样的报错;
- 检查了Dataform的执行日志,没有发现其他并发操作修改同一张表的情况;
- 尝试过在DROP和CREATE之间想办法加延时(但BigQuery存储过程里好像没法直接实现),问题依然存在。
有没有朋友碰到过类似的情况?或者能给我一些新的排查方向?比如BigQuery外部表的创建/删除有没有什么特殊的机制可能导致这种竞态条件?非常感谢大家的帮助!
内容来源于stack exchange
相关产品推荐
相关产品推荐

