数据迁移服务MMS(MaxCompute Migration Service)支持按指定范围(库、表、分区)创建迁移作业,并智能分配迁移任务。本文介绍迁移作业的组织与调度规则。
任务分配
核心概念
迁移作业(Migration Job)
定义一次完整迁移操作的最大逻辑单元。一个作业的核心是其定义的迁移范围(如某个库下的所有表,或指定的表/分区)。
迁移任务(Migration Task)
由 MMS 系统根据作业范围和分配规则自动生成的、可被独立调度和执行的最小物理单元。一个作业通常会被拆分为一个或多个并行的任务。
组织结构
一个迁移作业可以指定一个库、多个表或多个分区作为迁移范围。
说明迁移范围中已经迁移过的非分区表和分区,如果源端数据未更新,则不会重复迁移。
一个迁移作业包含一个或多个迁移任务。
一个迁移任务负责迁移一个非分区表或一个分区表下的一个或多个分区。

任务分配规则
迁移作业创建后,系统通过数据筛选和数据分组两个步骤,将表和分区拆分为细粒度的迁移任务。
步骤一:数据筛选
系统从作业指定的范围中,筛选满足以下所有条件的非分区表和分区作为实际迁移对象:
状态满足任一条件状态:
迁移状态不是 “完成”。
迁移状态是完成,但源端数据已更新。
说明源端数据有更新的判断逻辑:
更新元数据时,MMS 会拉取数据源的元数据(库、表、分区)进行缓存,并与上一次的缓存结果对比,如果发现特定元数据发生变化,则将表和分区标记为 数据已更新。
元数据对比项:
非分区表:使用 tableSchema, size, numRows, lastDdlTime, type 作为对比项,任一项不同则视为数据已更新。
分区表:使用 size, numRows, lastDdlTime 作为对比项,任一项不同则视为数据已更新。
不同数据源对比项值的来源:
BigQuery 使用
total_logical_bytes,total_rows作为 size 和 numRows 值。Hive 使用
metastore table property:rawDataSize、numRows作为 size 和 numRows 值。DataBricks delta 表会额外使用 l
astUpdateVersion作为对比项。MaxCompute 使用
last_data_modified_time作为 lastDdlTime。
满足数据源的黑白名单配置与迁移作业的分区过滤配置。
步骤二:数据分组
系统根据表类型采用不同的任务分配策略:
非分区表
每个非分区表独立分配一个迁移任务。
分区表
根据数据源配置中单个任务处理的最多分区数量和单个任务处理的最多数量(GB)两个配置,将同一个分区表下的分区分配到一个或多个迁移任务。两个条件中任一条件先达到阈值,则触发任务分配。
分区表任务分配示例:
示例 1:如果设置单个任务处理的最多分区数量为 1,则每个迁移任务仅包含一个分区。
示例 2:如果设置单个任务处理的最多分区数量为 100,单个任务处理的最多数据量为 1GB,当分区表中有两个分区并且 size 均大于 1GB 时,系统会为该表创建两个迁移任务,每个迁移任务包含一个分区。
使用示例
示例一:创建数据库迁移作业
假设一个迁移作业指定迁移 database_a 包含以下表:
非分区表:
table_a,table_b分区表:
table_c(含 100 个分区,每个分区 size = 10KB),table_d(含 2 个分区,每个分区 size = 10G)
提交迁移作业时,数据源配置为:单个任务处理的最多分区数量=50,单个任务处理的最多数量(GB)=5。
若数据源配置的批次大小为 50,则生成以下迁移任务:
任务1:迁移
table_a任务2:迁移
table_b任务3:迁移
table_c的分区 1-50任务4:迁移
table_c的分区 51-100任务5:迁移
table_d的分区 1任务6:迁移
table_d的分区 2

示例二:增量迁移
在上述database_a第一次迁移后,源端发生以下数据修改:
非分区表
table_b插入新数据新增非分区表
table_e删除分区表
table_d分区表
table_c:pt_100中新增数据
删除pt_99
新增pt_101
新增分区表
table_f(无分区)
此时,再次创建database_a的数据迁移作业,则生成以下迁移任务:
任务1:迁移
table_b任务2:迁移
table_c的分区100和分区101任务3:迁移
table_f的表结构

迁移状态
迁移作业状态
状态 | 说明 | 触发条件 |
待执行 | 作业已创建,等待调度执行 | 作业创建成功后的初始状态 |
执行中 | 作业至少有一个任务处于执行中 | 任一迁移任务开始执行 |
完成 | 作业下所有任务均已成功完成 | 所有迁移任务状态为"完成" |
失败 | 作业执行过程中出现错误 | 所有迁移任务结束,任一迁移任务执行失败 |
停止 | 作业已被手动停止 | 主动停止作业 |
迁移作业状态流转图:

迁移任务状态
状态 | 说明 | 触发条件 |
待执行 | 任务已创建,等待执行 | 任务创建成功后的初始状态 |
执行中 | 任务正在迁移数据 | 任务开始执行数据迁移 |
完成 | 任务成功完成数据迁移 | 任务涉及的所有表/分区迁移完成 |
失败 | 任务执行过程中出现错误 | 数据迁移过程中发生异常 |
停止 | 任务已被停止 | 作业被停止时,任务处于"待执行"或"执行中" |
迁移任务状态流转图:

表状态
状态 | 说明 | 适用对象 |
未迁移 | 表尚未开始迁移 | 非分区表、分区表 |
迁移中 | 表正在迁移过程中 | 非分区表、分区表 |
部分完成 | 分区表的部分分区已完成迁移 | 仅分区表 |
完成 | 表迁移已成功完成 | 非分区表、分区表(所有分区已完成) |
失败 | 表迁移过程中出现错误 | 非分区表、分区表 |
非分区表不存在"部分完成"状态。
分区表只有在所有分区均迁移完成后,状态才会变为"完成"。
非分区表状态流转图

分区表状态流转图

分区状态
状态 | 说明 | 触发条件 |
未迁移 | 分区尚未开始迁移 | 分区创建后的初始状态 |
迁移中 | 分区正在迁移过程中 | 分区对应的迁移任务状态为"执行中" |
完成 | 分区迁移已成功完成 | 分区对应的迁移任务完成 |
失败 | 分区迁移过程中出现错误 | 分区对应的迁移任务失败 |
分区状态流转图:

失败重试
对于状态为“失败”的迁移作业,可以执行重试操作。单击重试后,系统不会立即修改作业状态,而是等待失败的任务重新被调度执行后,作业状态才会相应变化。
重试操作仅针对失败的任务重新执行,已成功完成的任务不会重复执行。
修改目的地对状态的影响
修改数据库、表或分区的迁移目的地后,系统会将相关表和分区的状态重置为“未迁移”。
修改目的地后,原有的迁移任务将不再影响被修改对象的状态。
常见问题
数据迁移之后,如何增量同步
场景1:增量同步数据库下新增或修改过的表和分区
在数据源管理页面,重新同步元数据。
重新提交指定数据库的迁移作业。
说明根据数据筛选规则,迁移作业只会迁移新增和修改过的表和分区。
场景2:同步指定表下新增或修改过的分区
在数据源管理页面,重新同步元数据。
重新提交指定表的迁移作业。
如何重新迁移已完成的非分区表或分区
如果源端数据未更新,但需要重新迁移已完成的表或分区,按以下步骤操作:
在表列表或分区列表中,选择需要重新迁移的对象。
将其状态重置为"未迁移"。
重新提交迁移作业。

