本文为您介绍一键实时同步MaxCompute Merge任务节点失败后的排查与恢复方案。

Merge任务说明

基本原理

一键实时同步MaxCompute运行时会先将源表存量数据通过离线同步至Base表中(目标表),同时启动实时同步任务读取源库增量变更日志,写到增量日志表中(log表)。其后的数据处理逻辑:在T+1日的凌晨,启动Merge任务合并log表T日分区的增量数据和Base表T-1日分区中的全量数据,输出T日的全量分区数据。其过程如下图所示(分区表为例):过程

离线任务节点

一键实时同步到MaxCompute流程执行完成后,数据集成会在DataStudio中生成离线任务节点,如图所示,主要有三个节点:任务节点
  • checkStreamXDone:检查增量消费位点,确认前一天的增量分区数据是否已经同步完成,只有增量同步完成后才可以启动后续的Merge任务执行增量数据合并。
  • FullDataInitSuccssCheckDone:检查全量同步是否完成,源表存量数据会在首次执全增量同步任务或者加表时执行一次全量同步,同步至目标MaxCompute表。主要目的是确保任务首次运行或者新增表后,源表存量数据已经全部同步到目标表分区。
  • MergeInto:执行增量log表数据与Base表全量数据的合并,输出新的全量(分区)数据。

任务运行

离线任务节点由DataWorks调度系统在每日凌晨调度运行,在DataWorks运维中心 > 周期任务可以看到节点的调度依赖情况:MergeInto任务依赖FullDataInitSuccssCheckDone节点,FullDataInitSuccssCheckDone依赖CheckStreamXDone节点。调度依赖情况
说明
  • 每日凌晨的任务实例先后执行顺序为:CheckStreamXDone、FullDataInitSuccssCheckDone、MergeInto。
  • 其中MergeInto是自依赖调度节点,也即前一个周期的实例运行失败或者未运行,则下一个周期的实例不会被运行,其目的很明显,因为T+1日的Merge任务运行需要合并T-1日的全量分区数据,以保证数据的完整性。T-1日的全量分区数据由T日的Merge节点产生,因此T日Merge任务运行不成功,T-1日的全量分区就无法产出,T+1日的Merge实例就不能运行。

Merge任务运行

  • Merge任务执行时,会对每张同步表生成一个SQL子任务,读取log表中该表的增量数据,合并该表前一日分区的全量数据,输出截止前一日全量分区数据。
  • Merge任务的SQL子任务内部以并发方式执行,子任务如果有执行失败,符合条件的会内部执行自动重试,如果最终有子任务执行失败,则Merge节点执行失败。

常见Merge问题排查

Merge任务运行失败

  • Base table partition not exists.
    原因:前一日的全量分区没有产生,一般较少出现,可能场景:
    • 手动补数据运行Merge实例,但前一日实例没有运行,确保前一日Merge实例正常运行完成。
    • 首次运行时离线全量或者加表后全量同步未执行完成,如果存在同步失败的表,解决方案中通过先减表再加表的方式重新初始化该表。
    • 如果是其他原因,可能是触发了不支持的场景,请联系值班同学进一步排查。
  • Run job failed,instance:XXXX.
    原因:有ODPS SQL子任务运行失败,搜索instanceId,定位到错误日志,通常日志类似如下:
    Instance: XXX, Status: FAILED
    
     result: ODPS-0110061: Failed to run ddltask - Persist ddl plans failed.
    
    , Logview:
    
    http://Logview.odps.aliyun.com/Logview/?h=http://service.ap-southeast-1.maxcompute.aliyun-inc.com/api&p=sgods&i=20220807101011355goyu43wa&token=NFBwc2tzaEpJNGF0OVFINmJuREZrem1OamQ4PSxPRFBTX09CTzo1OTMwMzI1NTY1MTk1MzAzLDE2NjAxMjYyMTEseyJTdGF0ZW1lbnQiOlt7IkFjdGlvbiI6WyJvZHBzOlJlYWQiXSwiRWZmZWN0IjoiQWxsb3ciLCJSZXNvdXJjZSI6WyJhY3M6b2RwczoqOnByb2plY3RzL3Nnb2RzL2luc3RhbmNlcy8yMDIyMDgwNzEwMTAxMTM1NWdveXU0M3dhIl19XSwiVmVyc2lvbiI6IjEifQ== ]
    出现ODPS-XXXX这种错误提示,通常是代表ODPS内部执行错误,您可查看SQL错误码(ODPS-01CCCCX)文档查询报错以及解决办法,若文档中找不到或有其他问题,可以咨询MaxCompute技术支持人员。
  • Request rejected by flow control. You have exceeded the limit for the number of tasks you can run concurrently in this project. Please try later.

    原因:Merge并发提交的SQL子任务过多,触发了ODPS对该project并发限流。

    解决方案:
    • 设置Merge任务并发参数concurrency降低并发。
    • 更改Merge任务调度时间配置,打散Merge任务运行时间。
    • 联系MaxCompute技术支持人员解决。

分区数据未产生

原因:本次实例运行失败或者未运行完成,请前往运维中心 > 周期实例,检查Merge实例的执行情况:
  • 实例状态为运行中,等待当日Merge实例执行完成。
  • 实例状态为运行失败,查看Merge任务运行日志,分析失败原因,解决后右键该实例,进行重跑。
  • 实例状态为未运行:
    • 查看实例上游的checkStreamXDone节点是否执行完成,如果仍在执行,则需要查看实时任务是否有延迟,如有延迟先解决实时任务的延迟,延迟解决后,Merge任务会触发执行,查看日志内容,示例如下:
      2023-01-06 00:15:04,692 INFO  [DwcheckStreamXDoneNode.java:168] - 数据当前点位时间: 1672921729000
      
      2023-01-06 00:15:04,692 WARN  [DwcheckStreamXDoneNode.java:183] - 进行等待重试。
      
      2023-01-06 00:20:04,873 INFO  [DwcheckStreamXDoneNode.java:168] - 数据当前点位时间: 1672921729000
      
      2023-01-06 00:20:04,873 WARN  [DwcheckStreamXDoneNode.java:183] - 进行等待重试。
    • 上游依赖的前某次Merge实例未完成或者执行失败,运维中心查看该日Merge实例的上游Merge实例,找到最近一次未完成或运行失败Merge实例:
      • 如果该Merge任务执行失败:查看运行日志分析失败原因,解决后右键重跑该实例,以触发正常调度。
      • 如果该Merge任务实例处于未运行状态:检查其上游checkStreamXDone实例,确认是否完整,以及实时任务是否有延迟。
    • 之前的流程存在问题,新建或者重跑了一键整库同步流程,但因为Merge节点实例存在自身依赖,导致新Merge实例无法运行。 找到一键流程重新运行后的第一个Merge实例,右键去除依赖解除对上游的Merge节点的依赖,新Merge实例即可触发运行。

Merge任务运行慢或运行长时间不结束

运维中心查看任务运行日志,可以看到当前运行中的SQL任务,日志如下:

2022-08-07 18:10:58,919 INFO  [LogUtils.java:20] - Wait instance 20220807101058817gbb6ghx5 to finish...

2022-08-07 18:10:58,938 INFO  [LogUtils.java:20] - Wait instance 20220807101058818g46v43wa to finish...
在日志中根据instanceId搜索SQL任务的Logview如(instance20220807101058817gbb6ghx5):Logview Portal。可以打开Logview看SQL任务的执行情况,sql执行慢的可能性很多:
  • BASE数据量很大,启动的mapper和reducer过多,可以项目级别调整对应odps参数解决。
  • 启动的SQL任务过多,导致提交任务时资源不足,打开Logview,可以看到sql实例处在Waiting状态,需要优化解决ODPS资源问题。如有需要可以联系ODPS值班同学支持。
  • 如果未找到上述日志,可能存在提交ODPS SQL任务卡顿情况,可以找到最后的一个SQL Logview,查看日志或者联系ODPS值班同学支持分析Logview。

Merge任务导致ODPS资源被耗尽

  • Merge任务可以设置并发参数,控制同时提交的ODPS SQL任务数,在DataStudio中打开Merge任务节点,编辑配置内容增加concurrency参数控制并发度,修改配置完成后需要提交并发布。示例如下:设置并发数
    说明 该修改是任务级别的修改,当加减表或者重跑一键流程时节点内容会被覆盖,需要在之后重新添加concurrency提交、发布。
  • 更改Merge任务调度运行时间设置,错峰运行Merge任务,在DataStudio中打开Merge任务节点更改其定时时间设置,打散Merge任务运行密度。