全部产品
Search
文档中心

:迁移服务(MMA 4.0)

更新时间:Nov 25, 2024

MaxCompute提供数据迁移工具MMA(MaxCompute Migration Assist)4.0版本,允许您将其他数据源(如Hive、BigQuery等)的数据通过MMA迁移至MaxCompute。本文为您介绍如何使用MMA 4.0进行数据迁移。

功能介绍

MMA(MaxCompute Migration Assistant) 是一款用于向MaxCompute迁移数据的工具。目前支持的数据源如下:

  • Hive

  • DataBricks

  • BigQuery

使用MMA向MaxCompute迁移数据的大致流程如下:

image

迁移原理image

  • 元数据迁移:

    1. MMA通过元数据API获取数据源的元数据,具体是通过使用BigQuery SDK、Hive Metastore SDK、DataBricks SDK来调用API的。

    2. 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架构图如下:image

数据源

要迁移的对象,例如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角色绑定到阿里云账号。操作过程如下:

    1. 进入MaxCompute控制台项目管理页面,在左上角选择地域。

    2. 单击目标项目操作列的管理,进入项目配置页面。

    3. 切换至角色权限页签,然后单击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。

安装与配置

  1. 进入MMA_Releases,根据不同的数据源类型选择对应的mma-<3.x.x>-<datasource>.jar,例如mma-3.1.0-bigquery.jar

  2. 单击下载lib.zip文件并解压。

  3. 创建一个名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。

  4. 将文件目录调整为如下结构:

    /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数据。

  • BearerToken:用于公共云。

  • AK:用于专有云。

auth.ak.hdfs.path

(可选)当auth.type值为AK时,此处为存放AccessKey的文件路径,文件格式如下:

access_id=xxx
access_key=xxx

spark.dependency.root

Spark依赖根目录。

不同数据源的迁移操作

目前仅支持迁移BigQuery数据。

迁移BigQuery

添加数据源

  1. 数据源页面右侧,单击添加数据源,进入添加数据源页面。

  2. 数据源类型选择BIGQUERY,并单击下一步

  3. 根据如下参数说明配置数据源。

    参数名称

    描述

    数据源名称

    数据源名称,可自定义,不能包含字符、数字、汉字之外的特殊字符。

    BigQuery service account key file json

    通过BigQuery IAM控制台创建服务账号,下载鉴权JSON,详情请参见服务账号概述

    image

    image

    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的对应关系

    定时更新

    配置数据源元数据定时拉取,有以下两种定时方式:

    1. 每天:定时器每天运行一次,运行时刻为选定的24小时内的某一时间(精确到分钟)。

    2. 每小时:定时器每小时运行一次,运行时刻为选定的60分钟内的某一分钟。

    meta api访问并发量

    访问数据源元数据API的并发量,默认值为10。

    数据库白名单

    需要迁移的BigQuery数据库,多个值之间以英文逗号分隔。

    数据库黑名单

    不需要迁移的BigQuery数据库,多个值之间以英⽂逗号分隔。

    表黑名单, 格式为db.table

    不需要迁移的BigQuery数据库表。单个表的格式为dbname.tablename,多个表之间以英文逗号分隔。

    表白名单, 格式为db.table

    需要迁移的BigQuery数据库表。单个表的格式为dbname.tablename,多个表之间以英文逗号分隔。

更新数据源

若数据源的元数据有变动,您需要在MMA的数据源页面,单击目标数据源操作列的更新,以手动更新数据源并拉取最新元数据。

修改数据源配置

您也可以修改数据源的相关配置,操作如下:

  1. 在MMA的数据源页面,单击目标数据源的名称,进入数据源详情页面。

  2. 配置信息页签修改数据源的相关配置。

创建迁移任务

迁移多个Table
  1. 在MMA的数据源页面,单击目标数据源名称,进入数据源详情页面。

  2. 数据信息页签,单击目标库名,进入数据库详情页面。

  3. 在数据库详情页面的Table列表页签,选中要迁移的表,然后单击新建迁移任务

  4. 新建迁移任务对话框中配置如下参数,并单击确定

    参数名

    描述

    名称

    任务名称。

    任务类型

    迁移方式,通过BigQuery Storage Read API进行数据迁移。

    MC项目

    数据迁移的目标Maxompute项目。

    MC Schema

    可选,目标MaxCompute项目下的Schema。Schema详情请参见Schema操作

    table列表

    要迁移的Table名称列表,多个Table名称之间以英文逗号分隔。

    只迁新分区

    如果开启,则新建任务将忽略已经迁移成功的分区。

    定时执行

    配置任务定制执行,定时方式有两种

    1. 每天:定时器每天运行一次,运行时刻为选定的24小时内的某一时间(精确到分钟)。

    2. 每小时:定时器每小时运行一次,运行时刻为选定的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可以为空。

  5. 进入迁移任务>任务列表,可对已创建的迁移任务进行管理。具体请参见迁移任务管理

迁移单个Database
  1. 在MMA的数据源页面,单击目标数据源名称,进入数据源详情页面。

  2. 数据信息页签,单击目标库名操作列的迁移

  3. 新建迁移任务对话框中配置如下参数:

    参数名

    描述

    名称

    任务名称。

    任务类型

    迁移方式,选择通过Bigquery Storage Read API 进行数据迁移

    MC项目

    数据迁移的目标MaxCompute项目。

    MC Schema

    可选,目标MaxCompute项目下的Schema。Schema详情请参见Schema操作

    table白名单

    要迁移的table名称列表,如果不为空,则只会迁移该列表内的table。

    table黑名单

    黑名单内的table将不会被迁移。

    只迁新分区

    如果开启,则新建任务将忽略已经迁移成功的分区。

    定时执行

    配置任务定制执行,定时方式有两种

    1. 每天:定时器每天运行一次,运行时刻为选定的24时内的某一时间(精确到分钟)。

    2. 每小时:定时器每小时运行一次,运行时刻为选定的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可以为空。

  4. 进入迁移任务>任务列表,可对已创建的迁移任务进行管理。具体请参见迁移任务管理

迁移任务管理

管理任务

在MMA的顶部菜单栏单击迁移任务>任务列表,可进入任务列表页面查看所有状态的任务,您可针对不同状态下的任务执行删除停止启动重试等操作。

管理子任务

您可在子任务列表页面管理所有子任务。

  1. 进入子任务列表页面,有如下两种方式:

    • 在MMA的顶部菜单栏单击迁移任务>子任务列表,可进入子任务列表页面查看所有任务的子任务。

    • 任务列表页面,单击目标任务名,也可进入该任务的子任务列表页面。

  2. 您可在过滤栏根据任务名数据源源库源表状态等条件对子任务进行过滤。

  3. 单击目标子任务操作列的详情,可查看或下载该子任务的执行日志image

  4. 对于状态迁移数据失败的子任务,您可执行重试重新运行操作。

    子任务的运行会涉及迁移Schema、迁移数据、数据校验三个阶段,如果某个子任务“迁移数据”失败,执行重试操作时,子任务会重新执行“迁移数据”操作;执行重新运行操作时,子任务会从“迁移Schema”开始重新运行。

附录

分区过滤表达式说明

此处以一个具体示例为您介绍分区过滤表达式的含义,如:p1 >= '2022-03-04' and (p2 = 10 or p3 > 20) and p4 in ('abc', 'cde')

示例说明:

  • p1、p2和p3均为分区名。

  • 分区值仅包含字符串和数字,字符串被双引号或单引号包裹。除INT/BIGINT类型的分区列值外,其他类型的分区值都只能取字符串值。

  • 比较操作符包括:>、>=、= 、<、<=、<>

  • 分区过滤表达式支持IN操作符。

  • 逻辑操作符包括:ANDOR

  • 支持使用括号。

区域与区域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