本文为您介绍补数据的相关问题。
推荐您优先阅读使用指南补数据实例运维。
补数据功能说明
补数据支持补历史一段时间区间的数据或者需要补未来一段时间的数据时,可以选择补数据功能。节点使用的调度参数会根据补数据选择的业务时间自动替换为对应的值。将MySQL增量数据写入MaxCompute对应的时间分区中的示例如下。在离线同步任务中,调度参数 bizdate=$bizdate 需在三处协同配置:1)数据来源的数据过滤条件中使用 STR_TO_DATE('${bizdate}','%Y%m%d') <= gmt_modify_time AND gmt_modify_time < DATE_ADD(STR_TO_DATE('${bizdate}','%Y%m%d'), interval 1 day) 实现增量过滤;2)数据去向的分区信息设为 pt=${bizdate},清理规则选择写入前清理已有数据(Insert Overwrite);3)调度配置面板的参数栏填写 bizdate=$bizdate,生成实例方式选择T+1次日生成。三处的 ${bizdate} 取值保持一致,确保每次调度仅同步对应业务日期的增量数据。
补数据时,如果不同节点配置了不同格式的调度参数(例如 ${yyyy-mm} 和 ${yyyy_mm}),各节点按各自配置的参数格式独立计算,互不影响。系统根据所选业务日期自动计算并赋值给各节点的本次运行值,无需为不同节点做额外适配。单节点本地运行正常时,补数据同样正常。
为什么小时分钟任务补数据选择了分组运行但实际不生效?
问题现象
小时分钟任务补数据选择了分组运行但实际不生效。
产生原因
补数据分组运行控制是,补一段以天为维度的业务日期区间的数据以及几天的实例是否同时执行。此功能不控制小时、分钟任务当天的所有实例是否并发执行,当天小时分钟任务的实例是否并发执行与您小时分钟任务是否设置了自依赖有关。自依赖使用说明,请参见场景2:依赖上一周期的结果时,如何配置调度依赖。
解决措施
选择不分组运行,一个补数据实例下的多个业务日期串行执行,即上一个业务日期的补数据实例执行完,下一个业务日期的补数据实例才会执行。
选择分组运行,您可以设置同时使用2组、3组、4组或5组等多个补数据实例进行补数据,即多个补数据实例下有多个业务日期分组运行执行。
实时场景:假设小时或分钟任务选择补一个星期数据。
如果小时、分钟任务设置了自依赖,那么小时、分钟节点的实例会按照时间顺序依次执行。
如果小时节点任务没有设置自依赖,那么小时、分钟节点每天的实例会一并执行。
为什么补数据选择业务时间后不运行,实例显示黄色,实例状态显示等待时间?
问题现象
补数据选择业务时间后不运行,实例显示黄色,实例状态显示等待时间。
产生原因
如果您补数据选择的业务日期实例,其定时时间为未来时间时,会出现等待时间的情况。
解决措施
您可以选择立即执行未来时间的数据。在补数据对话框中,勾选立即运行定时时间大于此刻的补数据实例选项。
说明如果您补数据选择的业务时间(实例定时时间)为未来时间,当不勾选此选框时,实例会出现等待时间的情况(实例显示黄色,实例状态为等待时间)。
如果您补数据选的业务时间(实例定时时间)为未来时间,当勾选此选框时,实例会马上执行。
为什么补数据选择业务时间昨天和今天,也会出现等待时间的情况?
问题现象
补数据选择业务时间昨天和今天,会出现等待时间的情况。
产生原因
从平台维度来看,业务时间昨天的数据,今天调度运行。补数据补对应业务时间的数据相当于重新执行了一次对应业务时间的周期实例。
如果您需要过滤今天的周期实例,您需要在周期实例面板选择过滤业务时间昨天的实例,实例的定时时间为今天。在运维中心的周期任务运维 > 周期实例页面,将业务日期筛选为昨天,即可查看对应业务日期的周期实例记录及其运行状态。
为什么补数据选择补0点~1点生成了多个实例?
问题现象
补数据选择补0点~1点生成了多个实例。
产生原因
补数据生成多少个实例与您节点配置的定时时间有关。
假设小时任务设置0:00开始至23:59分每小时调度一次。如果选择补数据区间为00:00~1:00,那么将产生两个实例,实例定时时间分别为0:00,1:00。
假设分钟任务设置0:00开始至23:59分每30分钟调度一次。如果选择补数据区间为00:00~1:00,那么将产生三个实例,实例定时时间分别为0:00,00:30,1:00。
为什么进行大量补数据操作时,会出现等待资源情况(实例显示黄色,实例状态为等待资源)?
问题现象
进行大量补数据操作时,出现等待资源情况(实例显示黄色,实例状态为等待资源)。
产生原因
资源组可执行任务最大并发数有上限,如果当前任务执行并发数超过资源组所支持的最大并发数时,将会出现等待资源的情况。
说明等待资源排查,详情请参见等待资源。
为什么补数据报错调起的节点运行时间不在所选业务时间范围内?
问题现象
补数据报错调起的节点运行时间不在所选业务时间范围内。
产生原因
小时分钟任务需要选择具体的调度时间区间才可以正常生成补数据实例并执行。在补数据弹窗中,选择运行时间区间设置为
00:00 ~ 01:00,但被调起的节点实际调度运行时间不在该区间内,因此页面顶部出现告警提示"调起的节点运行时间不在所选业务时间范围之内",导致补数据失败。需将运行时间区间调整为覆盖目标节点调度时间的范围。
为什么有节点选择了补数据,但是没有生成补数据实例?
问题现象
某节点选择了补数据,但是没有生成补数据实例。
产生原因
不在生效日期范围内的节点不生成实例,请检查需要补数据的节点生效时间是否在有效期内。在任务的调度配置面板中,时间属性设置为正常调度,重跑属性未选择,出错自动重跑未勾选,生效日期为1999-09-09至1999-10-22(调度仅在有效日期内生效并自动调度),暂停调度未勾选,调度周期为日,定时调度时间为00:19。若补数据的业务日期不在生效日期范围内,则不会生成补数据实例。
周、月任务如何执行补数据操作
操作说明:周、月调度的任务在补数据时,业务时间请选择真实调度时间的前一天。任务定时时间为定时每周几或每月定时几号跑的任务,只有在指定调度时间才会真实跑数据,在非指定时间内,非调度时间内其他时间会生成空跑实例,不会实际执行任务,该实例状态为周、月实例空跑周期,更多空跑介绍,详情请参见场景一:周月实例空跑周期。
说明补数据选择的时间为业务日期,
业务日期=任务定时调度日期-1。调度参数与业务日期、实例定时时间、实际运行时间的关系,请参见调度参数支持的格式。
场景示例:对月调度任务进行补数据
任务调度周期定义:定时每月1号0点调度的任务,在补数据时,需要选择业务为上个月末。对月调度任务(如 调度周期_月)进行补数据时,任务属性中 调度周期 为 月,执行时间 为
00 00 00 1 * ?。在 补数据 对话框中,业务日期 按月粒度选择,例如将起止日期均设为 2022-11-30,表示补填 2022 年 11 月的数据,然后单击 确定。
补数据实例如何受最大并行实例数限制?
当任务在调度策略中开启了任务最大并行实例数后,补数据实例也受此限制,与周期实例共享并发配额。
当多类实例同时堆积时,仅非今日的补数据实例降低。
开启最大并行实例数限制后,仅对此后新生成的实例生效,在此之前已生成的实例不受限制。
最大并行实例数的取值范围为1~10000,默认值为1。
使用 OpenAPI 并行补数据后,报错 Can't update ObjectId BeginTs小于lastCommitTs 或“ODPS-0429311 元数据事务冲突”如何处理?
问题现象
使用 OpenAPI 并行补数据后,报错
Can't update ObjectId BeginTs小于lastCommitTs或“ODPS-0429311 元数据事务冲突”。产生原因
并行补数据时,若不同业务日期的任务同时执行且涉及表 DDL 操作,例如并发 ALTER TABLE、自动 Merge 与手动 DDL 同时发生、调度重叠等,会导致 MaxCompute 元数据事务冲突或 DDL 冲突。
解决措施
将补数据接口的 Parallelism 参数设置为 false,使任务串行执行,避免并发修改元数据;若为偶发冲突,通常重试即可解决。
说明配置 Parallelism 为 false 后,多个业务日期的补数据工作流变为严格串行执行,即前一个业务日期的所有实例成功后,下一个业务日期的实例才会开始执行。若上游业务日期的任务失败,下游业务日期的补数据实例将保持未运行状态,在旧版 API 中显示为“创建中”。目前无法通过 API 直接查询补数据总任务状态,仅支持按业务日期查询对应实例的运行状态。
补数据任务运行缓慢如何排查?
检查资源组负载
查看资源组的使用率。若使用率很高,说明资源打满导致排队,需减少并发任务数或扩容资源组。
分析 MaxCompute 作业日志 (Logview)
若资源未打满但任务仍慢,获取 Logview 地址分析 SQL 执行效率。重点检查是否存在数据膨胀,例如 Join 操作导致输出远大于输入;通过 Input 信息定位具体 SQL 节点及涉及的表,例如维表与事实表 Join 时键值分布不均导致笛卡尔积;并参考 MaxCompute 官方文档优化 SQL。
补数据结果与本地运行 SQL 结果不一致如何排查?
确认环境一致性
检查 DataWorks 生产环境与本地连接的数据源是否完全相同,注意区分测试库与生产库。
核对分区值
确认补数据任务中的分区值与本地查询使用的分区值一致,例如
ds='20260212',并检查 SQL 中分区字段赋值逻辑及业务日期格式。统一时区配置
在本地查询开头添加
SET odps.sql.timezone = <时区>;,例如SET odps.sql.timezone = America/Cancun;,确保时间字段解析与补数据任务一致,避免TO_CHAR、DATEADD等函数计算差异。完整复现 SQL 逻辑
以 DataWorks 运行日志中的完整 SQL 为准在本地执行,包含所有 JOIN、CASE 逻辑及 SET 参数,而非仅统计目标表行数。
控制台验证
建议在 DataWorks 控制台直接执行相同 SQL,排除本地环境干扰。