MaxCompute提供数据迁移工具MMA(MaxCompute Migration Assist)4.0版本,允许您将其他数据源(如Hive、BigQuery等)的数据通过MMA迁移至MaxCompute。本文为您介绍如何使用MMA 4.0进行数据迁移。
功能介绍
MMA(MaxCompute Migration Assistant) 是一款用于向MaxCompute迁移数据的工具。目前支持的数据源如下:
Hive
DataBricks
BigQuery
使用MMA向MaxCompute迁移数据的大致流程如下:
迁移原理
元数据迁移:
MMA通过元数据API获取数据源的元数据,具体是通过使用BigQuery SDK、Hive Metastore SDK、DataBricks SDK来调用API的。
MMA根据获取到的元数据生成MaxCompute DDL语句,并在MaxCompute中执行DDL,完成元数据迁移。
数据迁移:
方式1:拉模式,MMA通过Spark作业指定要迁移的对象,Spark作业运行在MaxCompute上,从数据源读取数据,并将其写入MaxCompute。对于不同的数据源,Spark读取数据的方式不同,具体如下:
数据源
读取数据方式
Bigquery
Read API
Hive on AWS s3
s3
Hive on HDFS
HDFS
方式2:推模式,MMA向数据源提交SQL、Spark作业,作业运行在数据源端,将数据从数据源读取后写入到MaxCompute,具体实现如下:
数据源
读取数据方式
Hive
运行UDTF,通过Tunnel将数据写入MaxCompute。
DataBricks
运行DataBricks Spark,通过Storage API将数据写入MaxCompute。
MMA名词解释
MMA架构图如下:
数据源
要迁移的对象,例如Hive的一个或多个Database、 BigQuery的一个或多个Project、DataBricks的一个Catalog。不同的数据源有不同的数据层级表示(如下表),目前MMA会将不同数据源的数据层级映射为Database、Schema和Table三层表示,其中Schema作为Table的属性存在。
数据源 | 数据层级 |
Hive | Database、Table |
Bigquery | Catalog、Schema、Table |
Databricks | Project、Dataset、Table |
任务与子任务
MMA迁移操作的对象可以是一个Database,多个Table或多个partition。选定操作对象,并建立迁移任务后,MMA会产生任务与子任务,其中任务中包含了迁移操作的配置信息(操作对象、迁移方法等)。任务会进一步被划分为子任务,子任务是实际迁移操作的执行单元。一个子任务会对应一个非分区表或一个分区表的多个分区。子任务执行的过程包含迁移元数据、迁移数据和数据校验三个阶段。
数据校验
MMA将数据迁移到MaxCompute后,会对数据进行校验。目前支持的校验方法比较简单,即在源端和MaxCompute端分别执行SELECT COUNT(*)命令获取操作对象(例如表或分区)的行数,然后进行对比。
前提条件
已创建MaxCompute项目。具体操作,请参见创建MaxCompute项目。
已为对应的用户授予目标MaxCompute项目的如下操作权限:
客体(Object)
权限
Project
List、CreateTable、CreateInstance
Table
Describe、Select、Alter、Update、Drop
Instance
Read、Write
关于具体的授权方案可以参考授权方案,或者直接将admin角色绑定到阿里云账号。操作过程如下:
进入MaxCompute控制台项目管理页面,在左上角选择地域。
单击目标项目操作列的管理,进入项目配置页面。
切换至角色权限页签,然后单击admin角色操作列的成员管理,将admin角色赋予相应的用户。
已准备如下操作环境:
操作系统:
需准备Linux操作系统。
系统配置:若表的分区数≤500W,建议使用8核16 GB的配置,若表的分区数>500W,则需要更高的配置。
JDK版本需要为Java 8或者Java 11。
MySQL需要为V5.7或以上版本。
使用限制
BigQuery迁移限制如下:
数据类型
暂不支持BIGNUMERIC、JSON、INTERVAL、GEOGRAPHY和RANGE类型。
迁移时,TIME类型会被转换为STRING类型。
表Schema
表名和列名仅支持长度小于或等于128的大小写字母、数字和下划线。
表中列的数量上限为1200。
安装与配置
进入MMA_Releases,根据不同的数据源类型选择对应的
mma-<3.x.x>-<datasource>.jar,例如mma-3.1.0-bigquery.jar。单击下载lib.zip文件并解压。
创建一个名config.ini的文件,并添加如下参数配置,示例config.ini文件内容如下:
[mysql] host = mysql-host port = 3306 ; can be any database name db = mmav3 username = user password = pass [mma] listening_port = 6060参数说明:
类别
参数名
描述
mysql
host
登录MySQL所使用的IP地址。
port
MySQL服务器的端口号,默认为3306。
db
MySQL数据库名称。
username
MySQL数据库的登录用户名。
password
MySQL数据库的登录密码。
mma
listening_port
MMA所在服务器的监听端口号,默认为6060。
将文件目录调整为如下结构:
/path/to/mma | ├── mma-3.1.0-<datasource>.jar # MMA 主程序 ├── config.ini # MMA配置文件 └── lib/ └── spark/ # Spark 迁移任务依赖目录 ├── log/ # 程序运行时自动生成,spark 提交日志 ├── spark-3.1.1-odps0.34.1/ # Maxcompute Spark-3.1.1 依赖 ├── bigquery-spark-job.jar # Spark 迁移任务 └── mma-spark-client.jar # Spark 提交程序
运行程序
您可以通过命令启动MMA程序,并访问MMA页面,也可停止MMA。
运行程序时,您需将下述命令中的<datasource>替换为相应的数据源类型。
启动MMA
建议使用nohup启动程序,启动命令如下。
nohup java -jar mma-3.1.0-<datasource>.jar -c config.ini > nohup.log 2>&1 &停止MMA
如果需要停止MMA程序,可以使用如下命令直接终止已经启动的MMA程序。停止MMA程序会导致正在运行的迁移任务中断,但是重新启动MMA后,被中断的任务会被重新执行,并且不影响最终的迁移结果。
ps aux | grep mma-3.1.0-<datasource>.jar | grep -v grep | awk '{print $2}' | xargs kill -9访问MMA
MMA程序启动后,您可浏览器端输入http://拉起服务的ip:6060(6060通过config.ini中的listening_port进行配置)访问MMA。浏览器打开MMA后,您需要在MMA配置页面配置以下参数:
MMA目前没有提供访问认证,您需要通过网络策略限定MMA的访问。比如,如果MMA运行在阿里云ECS上,需要通过ECS的安全组来控制哪些IP可以访问MMA。
配置项 | 配置说明 |
mc.endpoint | 用于MMA访问MaxCompute的Endpoint,要求MMA所在服务器能够连通mc.endpoint,具体的Endpoint信息可以参考Endpoint。 |
mc.data.endpoint | (可选)通过Hive UDTF迁移数据时⽤于UDTF访问MaxCompute,此时要求Hive集群的节点能够连通该地址。 |
mc.tunnel.endpoint | (可选)通过Hive UDTF迁移数据时用于UDTF访问MaxCompute,此时要求Hive集群的节点能够连通该地址。 |
mc.auth.access.id | ⽤于访问MaxCompute的AccessKey ID。 您可以进入AccessKey管理页面获取AccessKey Secret。 |
mc.auth.access.key | 用于访问MaxCompute的AccessKey Secret。 |
mc.default.project | MMA会使⽤该项⽬的配额在MaxCompute上执⾏SQL命令。 |
mc.tunnel.quota | (可选)通常用不到,可忽略。 |
mc.projects | 要迁往的MaxCompute项⽬名列表。多个项⽬名之间以英⽂逗号分隔。 |
task.max.num | 用于迁移数据的MMA任务最大并发数,该参数是调节迁移速度的重要参数之一。 |
auth.type | (可选)仅用于通过Hive UDTF迁移Hive数据。
|
auth.ak.hdfs.path | (可选)当 |
spark.dependency.root | Spark依赖根目录。 |
不同数据源的迁移操作
目前仅支持迁移BigQuery数据。
迁移BigQuery
添加数据源
在数据源页面右侧,单击添加数据源,进入添加数据源页面。
数据源类型选择BIGQUERY,并单击下一步。
根据如下参数说明配置数据源。
参数名称
描述
数据源名称
数据源名称,可自定义,不能包含字符、数字、汉字之外的特殊字符。
BigQuery service account key file json
通过BigQuery IAM控制台创建服务账号,下载鉴权JSON,详情请参见服务账号概述。


BigQuery project name
服务账号授权的项目名。
范围分区表(Range Partition Table)迁移方式
BigQuery范围分区表迁移方式,当前只支持迁移到MaxCompute分区表。
默认值为Partition。
时间单位列分区表(Time-unit Column-partitioned Table)是否保留分区列作为普通列,默认保留
BigQuery单位列分区表,是否保留分区列作为普通列保存到MaxCompute。
默认保留。
注入时间分区表(Ingestion-time Partitioned Table)是否保留伪列作为普通列,默认不保留
BigQuery注入时间分区表,是否保留伪列作为普通列保存到MaxCompute。
默认为false(不保留)。
MaxCompute Spark NetworkLink Name: region:name
网络连接名称,详情请参见网络开通流程的“访问VPC方案(专线直连)”部分。
配置格式为
<regionId>:<vpcId>。示例:如果VPC ID为vpc-uf68aeg673p0k********,Region为上海,则此处应配置为cn-hanghai:vpc-uf68aeg673p0k********。关于Region和RegionId对应关系,请参见区域与区域ID的对应关系。定时更新
配置数据源元数据定时拉取,有以下两种定时方式:
每天:定时器每天运行一次,运行时刻为选定的24小时内的某一时间(精确到分钟)。
每小时:定时器每小时运行一次,运行时刻为选定的60分钟内的某一分钟。
meta api访问并发量
访问数据源元数据API的并发量,默认值为10。
数据库白名单
需要迁移的BigQuery数据库,多个值之间以英文逗号分隔。
数据库黑名单
不需要迁移的BigQuery数据库,多个值之间以英⽂逗号分隔。
表黑名单, 格式为db.table
不需要迁移的BigQuery数据库表。单个表的格式为
dbname.tablename,多个表之间以英文逗号分隔。表白名单, 格式为db.table
需要迁移的BigQuery数据库表。单个表的格式为
dbname.tablename,多个表之间以英文逗号分隔。
更新数据源
若数据源的元数据有变动,您需要在MMA的数据源页面,单击目标数据源操作列的更新,以手动更新数据源并拉取最新元数据。
修改数据源配置
您也可以修改数据源的相关配置,操作如下:
在MMA的数据源页面,单击目标数据源的名称,进入数据源详情页面。
在配置信息页签修改数据源的相关配置。
创建迁移任务
迁移多个Table
在MMA的数据源页面,单击目标数据源名称,进入数据源详情页面。
在数据信息页签,单击目标库名,进入数据库详情页面。
在数据库详情页面的Table列表页签,选中要迁移的表,然后单击新建迁移任务。
在新建迁移任务对话框中配置如下参数,并单击确定。
参数名
描述
名称
任务名称。
任务类型
迁移方式,通过BigQuery Storage Read API进行数据迁移。
MC项目
数据迁移的目标Maxompute项目。
MC Schema
可选,目标MaxCompute项目下的Schema。Schema详情请参见Schema操作。
table列表
要迁移的Table名称列表,多个Table名称之间以英文逗号分隔。
只迁新分区
如果开启,则新建任务将忽略已经迁移成功的分区。
定时执行
配置任务定制执行,定时方式有两种
每天:定时器每天运行一次,运行时刻为选定的24小时内的某一时间(精确到分钟)。
每小时:定时器每小时运行一次,运行时刻为选定的60分钟内的某一分钟。
只迁Schema
只在MaxCompute创建相应的表和分区, 不迁移数据。
开启校验
如果开启,MMA将在源、目标端分区执行
select count(*)获取迁移对象的行数,根据行数验证数据是否迁移成功。合并分区
通常用不到,可忽略。
分区过滤
详情请参见分区过滤表达式说明。
表名映射
一个Table迁移到目标MaxCompute Project后的名称。
列名映射
Table列名中迁移到MaxCompute后的名称。
表名映射规则
表名映射配置需要对每个表分别进行配置,如果要迁移的多个表在迁移到MaxCompute后,名称变动方式是固定的,可以使用该配置。
配置格式为
prefix${table}suffix。例如:该项值为pre_${table}_1时,如果源表名为test,则迁移到MaxCompute后,表名将会为pre_test_1。prefix和suffix可以为空。进入迁移任务>任务列表,可对已创建的迁移任务进行管理。具体请参见迁移任务管理。
迁移单个Database
在MMA的数据源页面,单击目标数据源名称,进入数据源详情页面。
在数据信息页签,单击目标库名操作列的迁移。
在新建迁移任务对话框中配置如下参数:
参数名
描述
名称
任务名称。
任务类型
迁移方式,选择通过Bigquery Storage Read API 进行数据迁移。
MC项目
数据迁移的目标MaxCompute项目。
MC Schema
可选,目标MaxCompute项目下的Schema。Schema详情请参见Schema操作。
table白名单
要迁移的table名称列表,如果不为空,则只会迁移该列表内的table。
table黑名单
黑名单内的table将不会被迁移。
只迁新分区
如果开启,则新建任务将忽略已经迁移成功的分区。
定时执行
配置任务定制执行,定时方式有两种
每天:定时器每天运行一次,运行时刻为选定的24时内的某一时间(精确到分钟)。
每小时:定时器每小时运行一次,运行时刻为选定的60分钟内的某一分钟。
只迁Schema
只在MaxCompute创建相应的表、分区,不迁移数据。
开启校验
如果开启,MMA将在源、目标端分区执行
select count(*)获取迁移对象的行数,根据行数验证数据是否迁移成功。合并分区
通常用不到,可忽略。
分区过滤
详情请参见分区过滤表达式说明。
表名映射
一个table迁移到目标MaxCompute Project后的名称。
列名映射
table列名中迁移到MaxCompute后的名称。
表名映射规则
表名映射配置需要对每个表分别进行配置,如果要迁移的多个表在迁移到MaxCompute后,名称变动方式是固定的,可以使用该配置。
配置格式为
prefix${table}suffix。例如:该项值为pre_${table}_1时,如果源表名为test,则迁移到MaxCompute后,表名将会为pre_test_1。prefix和suffix可以为空。进入迁移任务>任务列表,可对已创建的迁移任务进行管理。具体请参见迁移任务管理。
迁移任务管理
管理任务
在MMA的顶部菜单栏单击迁移任务>任务列表,可进入任务列表页面查看所有状态的任务,您可针对不同状态下的任务执行删除、停止、启动和重试等操作。
管理子任务
您可在子任务列表页面管理所有子任务。
进入子任务列表页面,有如下两种方式:
在MMA的顶部菜单栏单击迁移任务>子任务列表,可进入子任务列表页面查看所有任务的子任务。
在任务列表页面,单击目标任务名,也可进入该任务的子任务列表页面。
您可在过滤栏根据任务名、数据源、源库、源表及状态等条件对子任务进行过滤。
单击目标子任务操作列的详情,可查看或下载该子任务的执行日志。

对于状态为迁移数据失败的子任务,您可执行重试或重新运行操作。
子任务的运行会涉及迁移Schema、迁移数据、数据校验三个阶段,如果某个子任务“迁移数据”失败,执行重试操作时,子任务会重新执行“迁移数据”操作;执行重新运行操作时,子任务会从“迁移Schema”开始重新运行。
附录
分区过滤表达式说明
此处以一个具体示例为您介绍分区过滤表达式的含义,如:p1 >= '2022-03-04' and (p2 = 10 or p3 > 20) and p4 in ('abc', 'cde')。
示例说明:
p1、p2和p3均为分区名。
分区值仅包含字符串和数字,字符串被双引号或单引号包裹。除INT/BIGINT类型的分区列值外,其他类型的分区值都只能取字符串值。
比较操作符包括:
>、>=、= 、<、<=、<>。分区过滤表达式支持
IN操作符。逻辑操作符包括:
AND和OR。支持使用括号。
区域与区域ID的对应关系
区域 | RegionID |
华东1(杭州) | cn-hangzhou |
华东2(上海) | cn-shanghai |
华北2(北京) | cn-beijing |
华北3(张家口) | cn-zhangjiakou |
华北6(乌兰察布) | cn-wulanchabu |
华南1(深圳) | cn-shenzhen |
西南1(成都) | cn-chengdu |
中国香港 | cn-hongkong |
华东 2 金融云 | cn-shanghai-finance-1 |
华北 2 阿里政务云 1 | cn-north-2-gov-1 |
华南 1 金融云 | cn-shenzhen-finance-1 |
日本(东京) | ap-northeast-1 |
新加坡 | ap-southeast-1 |
马来西亚(吉隆坡) | ap-southeast-3 |
印度尼西亚(雅加达) | ap-southeast-5 |
德国(法兰克福) | eu-central-1 |
英国(伦敦) | eu-west-1 |
美国(硅谷) | us-west-1 |
美国(弗吉尼亚) | us-east-1 |
阿联酋(迪拜) | me-east-1 |