本文为您介绍使用MMA如何进行数据迁移、检查SQL语法兼容性、查看迁移评估报告。

一键式数据迁移

命令格式
python3 odps-data-carrier/bin/run.py -h
参数说明
参数名称 参数说明
-h, --help 打印帮助信息。
--hms_thrift_addr HMS_THRIFT_ADDR 指定Hive Metastore的Thrift地址。
--mode MODE 选择迁移模式,支持SINGLE或BATCH。
  • SINGLE模式为单表迁移模式。
  • BATCH模式为批量迁移模式,会将输入文件中指定的表批量迁移至MaxCompute。
--metasource METASOURCE 指定Metadata Source,即meta-carrier的输出目录,常用于定制化迁移场景。
--datasource DATASOURCE 指定数据来源,默认为Hive。如果数据通过闪电立方链路迁移,请选择OSS。

链路说明请参见迁移解决方案

--hive_db HIVE_DB 单表迁移模式下,指定待迁移表所在的Hive数据库名称。
--hive_table HIVE_TABLE 单表迁移模式下,指定待迁移表的Hive表名。
--mc_project MC_PROJECT 单表迁移模式下,指定待迁移表的MaxCompute Project名称。
--mc_table MC_TABLE 单表迁移模式下,指定待迁移表的MaxCompute表名。
--parallelism PARALLELISM 执行任务允许的最大并行度,即允许同时进行表迁移任务的最大数量。
--table_mapping TABLE_MAPPING 批量迁移模式下的输入文件路径,指定待迁移表从Hive到MaxCompute的映射。 文件每一行表达一个表的映射关系,格式为<hive db>.<hive tbl>:<mc project>.<mc tbl>
--dynamic_scheduling 打开动态调度开关。这个开关允许MMA自动感知目前集群压力,在集群任务数量超过某个阈值时,停止提交任务。阈值由--threshold THRESHOLD参数设定。
--threshold THRESHOLD 当动态调度开关打开时,此参数设置停止提交任务的阈值。
--validate_only 只对指定的表做数据校验。
--verbose 是否打印Debug信息。
--num_of_partitions 设置单次(即单个SQL)可以迁移的分区数上限。

如果表的数据量较大(例如TB级以上)、分区数较多,建议使用此参数指定单次迁移的分区数,分批次对表数据进行迁移。

当部分分区迁移失败时,不用重新进行整表迁移,单独迁移失败分区即可。

--failover_success_file 指定已经迁移成功的SQL文件,重新迁移时会跳过指定的文件。
--failover_failed_file 指定校验失败的SQL文件,用于单独重新迁移失败的SQL文件。
--append 单分区(即分区级)迁移时必须使用此参数,否则会Drop已经创建的表。
示例
  • 示例1:Hive和OSS的单表迁移和批量迁移
    • Hive批量迁移至MaxCompute。
      python3 odps-data-carrier/bin/run.py --mode BATCH --hms_thrift_addr thrift://127.0.0.1:9083 --table_mapping table_mappings/hive-odps.txt 
    • Hive单表迁移至MaxCompute。
      python3 odps-data-carrier/bin/run.py --hms_thrift_addr thrift://127.0.0.1:9083 --mode SINGLE --datasource Hive --hive_db dma_demo --hive_table inventory --mc_project mma_demo --mc_table inventory
    • OSS批量迁移至MaxCompute。
      python3 odps-data-carrier/bin/run.py --hms_thrift_addr thrift://127.0.0.1:9083 --mode BATCH --datasource OSS --table_mapping table_mappings/oss-odps.txt
    • OSS单表迁移至MaxCompute。
      python3 odps-data-carrier/bin/run.py --hms_thrift_addr thrift://127.0.0.1:9083 --mode SINGLE --datasource OSS --hive_db dma_demo --hive_table web_sales --mc_project oss_odps_mma --mc_table web_sales
  • 示例2:自定义分区数的分批次迁移
    执行如下语句批量迁移时,可以使用num_of_partitions参数指定每个Hive SQL迁移的分区数。
    python3 ./odps-data-carrier/bin/run.py --hms_thrift_addr thrift://127.0.0.1:9083 --mode BATCH --datasource Hive --table_mapping ods_table_mapping.txt --num_of_partitions 10 --parallelism 2

    MMA执行时会根据设置的分区数量,在tmp目录下生成相应的Hive SQL,即每个作业迁移10个分区的数据。

    从MMA的进程中,可以看到MMA通过hive -f提交到tmp下的SQL语句。也可以通过parallelism参数,控制MMA同时向Hive提交的作业数。11
  • 示例3:使用failover_succeed_file模式实现断点续传
    1. 首次迁移分区表。
      使用num_of_partitions参数指定每个Hive SQL迁移的分区数。
      python3 ./odps-data-carrier/bin/run.py --hms_thrift_addr thrift://127.0.0.1:9083 --mode BATCH --datasource Hive --table_mapping ods_table_mapping.txt --num_of_partitions 10 --parallelism 2

      执行结束后会生成succeed_*.txt文件,用来保存已经执行成功SQL文件。

    2. 重新迁移失败分区。
      使用failover_success_file参数指定已经迁移成功的SQL文件,即上一步中生成的succeed_*.txt文件。使用num_of_partitions参数指定每个Hive SQL迁移的分区数。
      python3 ./odps-data-carrier/bin/run.py --hms_thrift_addr thrift://127.0.0.1:9083 --mode BATCH --datasource Hive --table_mapping ods_table_mapping.txt --num_of_partitions 10 --parallelism 2 --failover_success_file succeed_1580973037.txt

      执行时,MMA会跳过已经迁移成功的SQL文件,执行上次迁移失败的SQL文件。

  • 示例4:使用failover_failed_file模式同步增量分区
    1. 使用validate_only参数进行数据校验。此命令仅对数据进行校验,不对数据进行迁移。
      python3 ./odps-data-carrier/bin/run.py --hms_thrift_addr thrift://127.0.0.1:9083 --mode BATCH --datasource Hive --table_mapping ods_table_mapping.txt --num_of_partitions 10 --validate_only

      执行结束会生成validate_failed_*.txt文件,用来保存校验失败的SQL文件。

    2. 重新迁移校验失败的SQL文件。
      使用failover_failed_file参数指定校验结果失败的文件,即上一步生成的validate_failed_*.txt文件。
      python3 ./odps-data-carrier/bin/run.py--hms_thrift_addr thrift://127.0.0.1:9083 --mode BATCH --datasource Hive --table_mapping ods_table_mapping.txt--num_of_partitions 10 --parallelism 2 --failover_failed_file validate_failed_1581053680.txt

      执行时,MMA直接执行校验失败的SQL文件。

  • 示例5:分区级迁移
    1. 准备Table_Mapping文件。
      • 文件内容格式为:(源表)db.table_name(partition_column1=,partition_column2=):(目的表)project.table_name
      • 分区字段类型需要为STRING类型,并且分区值不需要加双引号("")或单引号('')。
      • Table_Mapping支持全表和单分区混写方式。
    2. 执行如下语句进行分区级迁移。必须使用append参数,否则会Drop已经创建的表。
      python3 ./odps-data-carrier/bin/run.py --hms_thrift_addr thrift://127.0.0.1:9083 --mode BATCH --datasource Hive --table_mapping table_mappings/dma_demo.txt --append

基于Kerberos身份认证的数据迁移方法

此方法适用于Hive Metadata有安全配置时的数据迁移。安全配置的更多信息,请参见准备运行环境

  1. 执行如下命令获取Hive Meta。此处需要添加principalsystem参数。
    odps-data-carrier/bin/meta-carrier -u thrift://127.0.0.1:9083 -d dma_demo -o meta --principal hive/xxx.xxx.xxx@xxx.xxx --system java.security.krb5.conf=/etc/krb5.conf java.security.auth.login.config=/root/gss-jaas.conf javax.security.auth.useSubjectCredsOnly=false
    命令中参数说明如下,请您自行替换。
    • -u:Hive Metastore的Thrift地址。
    • -d:待迁移数据所在数据库名称。
    • -o:Hive Meta的输出目录。
    • --principal:认证主体,即用户名。
    • --system:Kerberos的系统配置。
  2. 执行如下命令进行一键迁移,命令中需要指定第一步Hive Meta的输出目录。
    python3 odps-data-carrier/bin/run.py --hms_thrift_addr thrift://127.0.0.1:9083 --mode BATCH --metasource meta --datasource Hive --table_mapping table_mappings/hive-odps.txt

SQL语法兼容性检查

使用sql-checker检查Hive SQL是否可以直接在MaxCompute执行,会返回语法兼容问题及修改建议。

命令格式
示例
  1. 执行如下命令生成Hive Meta目录。
    ./odps-data-carrier/bin/meta-carrier -u thrift://127.0.0.1:9083 -o meta -d dma_demo
  2. 执行如下命令检查Hive SQL是否可以在MaxCompute上运行。
    ./odps-data-carrier/bin/sql-checker -i meta --project hive_odps_mma --sql 'SQL_CLAUSE'

网络连通性测试

使用network-measurement-tool,测试集群到MaxCompute各Region的网络连通质量和网络上下行传输速率。

查看迁移评估报告

执行如下步骤获取评估报告:
  1. 执行如下命令生成Hive Meta目录。
    ./odps-data-carrier/bin/meta-carrier -u thrift://127.0.0.1:9083 -o meta -d dma_demo
  2. 执行如下命令生成report.html
    ./odps-data-carrier/bin/meta-processor -i meta -o output
  3. output目录下查看report.html(建议您下载之后在浏览器查看)。
以下是一个报告的举例。
  • 报告中将搬站风险分为两档,高风险(HIGH RISK)与中等风险(MODERATE RISK)。
  • 高风险表示迁移过程必须人工介入。例如,出现了表名冲突、MaxCompute完全不支持的类型等问题时,需要人工介入。
  • 中等风险表示在迁移过程中可以自动处理,但是需要告知用户潜在风险。例如,Hive数据类型转换至MaxCompute数据类型会带来的精度损失等问题。