Amazon Redshift数据迁移至MaxCompute

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文为您介绍如何通过公网环境将Amazon Redshift数据迁移至MaxCompute。

前提条件

  • 准备Amazon Redshift集群环境及数据环境。

    您可以登录AWS官网,获取创建Redshift集群的详细操作内容,详情请参见Amazon Redshift集群管理指南

    1. 创建Redshift集群。如果已有Redshift集群,您可以直接使用已有的Redshift集群。Redshift集群

    2. 在Redshift集群中准备好需要迁移的Amazon Redshift数据。

      假设,已在public schema中准备好了TPC-H数据集。数据集使用MaxCompute 2.0数据类型和Decimal 2.0数据类型。

  • 准备MaxCompute的项目环境

    操作详情请参见准备工作

    新加坡区域为例,创建作为迁移目标的MaxCompute项目。由于TPC-H数据集使用MaxCompute 2.0数据类型和Decimal 2.0数据类型,因此本文创建的项目为MaxCompute 2.0版本。创建项目空间

  • 开通阿里云OSS服务。

    开通阿里云OSS服务详情请参见开通OSS服务

背景信息

将Amazon Redshift数据迁移至MaxCompute的流程如下。迁移流程

序号

描述

将Amazon Redshift数据导出至Amazon S3数据湖(简称S3)。

通过对象存储服务OSS的在线迁移上云服务,将数据从S3迁移至OSS。

将数据从OSS迁移至同区域的MaxCompute项目中,并校验数据完整性和正确性。

说明

由于Amazon Redshift和MaxCompute之间语法存在很多差异,因此在实际迁移过程中,您需要修改Amazon Redshift上编写的脚本,然后才能在MaxCompute中使用。更多Amazon Redshift和MaxCompute间的语法差异信息,请参见Amazon RedShift到MaxCompute迁移实践指导

步骤一:将Amazon Redshift数据导出至S3

Amazon Redshift支持IAM角色和临时安全凭证(AccessKey)认证方式。您可以基于这两种认证方式通过Redshift UNLOAD命令将数据导出至S3。将Amazon Redshift数据导出至S3的详细操作内容请参见卸载数据

两种认证方式的UNLOAD命令格式如下:

  • 基于IAM角色的UNLOAD命令

    -- 通过UNLOAD命令将表customer的内容导出至S3。
    UNLOAD ('SELECT * FROM customer')
    TO 's3://bucket_name/unload_from_redshift/customer/customer_' --S3 Bucket。
    IAM_ROLE 'arn:aws:iam::****:role/MyRedshiftRole'; --角色ARN。
  • 基于AccessKey的UNLOAD命令

    -- 通过UNLOAD命令将表customer的内容导出至S3。
    UNLOAD ('SELECT * FROM customer')
    TO 's3://bucket_name/unload_from_redshift/customer/customer_' --S3 Bucket。
    Access_Key_id '<access-key-id>'  --IAM用户的Access Key ID。
    Secret_Access_Key '<secret-access-key>'  --IAM用户的Access Key Secret。
    Session_Token '<temporary-token>';  --IAM用户的临时访问令牌。

UNLOAD命令导出的数据格式如下:

  • 默认格式

    命令示例如下。

    UNLOAD ('SELECT * FROM customer')
    TO 's3://bucket_name/unload_from_redshift/customer/customer_'
    IAM_ROLE 'arn:aws:iam::****:role/redshift_s3_role';

    执行成功后,导出以竖线(|)分隔的文本文件。您可以登录S3控制台,在对应Bucket中查看导出的文本文件。导出位置导出的文本文件格式如下。默认导出格式

  • PARQUET格式

    以PARQUET格式导出,便于其它引擎直接读取数据。命令示例如下。

    UNLOAD ('SELECT * FROM customer')
    TO 's3://bucket_name/unload_from_redshift/customer_parquet/customer_'
    FORMAT AS PARQUET
    IAM_ROLE 'arn:aws:iam::xxxx:role/redshift_s3_role';

    执行成功后,您可以在对应Bucket中查看导出的文件。PARQUET文件比文本文件更小,数据压缩率更高。导出位置

本文以IAM角色认证及导出PARQUET格式为例介绍数据迁移操作。

  1. 新建Redshift类型的IAM角色。

    1. 登录IAM控制台,单击创建角色

      创建IAM Role

    2. 创建角色页面的选择一个使用案例区域,单击Redshift。在选择您的使用案例区域单击Redshift-Customizable后,单击下一步:权限

      选择案例

  2. 添加读写S3的权限策略。在创建角色页面的Attach权限策略区域,输入S3,选中AmazonS3FullAccess,单击下一步:标签

    选择策略

  3. 为IAM角色命名并完成IAM角色创建。

    1. 单击下一步:审核,在创建角色页面的审核区域,配置角色名称角色描述,单击创建角色,完成IAM角色创建。

      角色审核

    2. 返回IAM控制台,在搜索框输入redshift_s3_role,单击redshift_s3_role角色名称,获取并记录角色ARN

      执行UNLOAD命令迁移数据时会使用角色ARN访问S3。获取角色RAN

  4. 为Redshift集群添加创建好的IAM角色,获取访问S3的权限。

    1. 登录Amazon Redshift控制台,在右上角选择区域为亚太地区(新加坡)

    2. 在左侧导航栏,单击集群,选中已创建好的Redshift集群,在操作下拉列表选择管理IAM角色

    3. 管理IAM角色页面,单击搜索框右侧的下拉图标图标,选择redshift_s3_role。单击添加IAM角色 > 完成,将具备S3访问权限的redshift_s3_role添加至Redshift集群。

  5. 将Amazon Redshift数据导出至S3。

    1. 返回Amazon Redshift控制台

    2. 在左侧导航栏,单击编辑器,执行UNLOAD命令将Amazon Redshift数据以PARQUET格式导出至S3的Bucket目录。

      命令示例如下。

      UNLOAD ('SELECT * FROM customer')   
      TO 's3://bucket_name/unload_from_redshift/customer_parquet/customer_' 
      FORMAT AS PARQUET 
      IAM_ROLE 'arn:aws:iam::xxxx:role/redshift_s3_role';
      UNLOAD ('SELECT * FROM orders')   
      TO 's3://bucket_name/unload_from_redshift/orders_parquet/orders_' 
      FORMAT AS PARQUET 
      IAM_ROLE 'arn:aws:iam::xxxx:role/redshift_s3_role';
      UNLOAD ('SELECT * FROM lineitem')   
      TO 's3://bucket_name/unload_from_redshift/lineitem_parquet/lineitem_' 
      FORMAT AS PARQUET 
      IAM_ROLE 'arn:aws:iam::xxxx:role/redshift_s3_role';
      UNLOAD ('SELECT * FROM nation')   
      TO 's3://bucket_name/unload_from_redshift/nation_parquet/nation_' 
      FORMAT AS PARQUET 
      IAM_ROLE 'arn:aws:iam::xxxx:role/redshift_s3_role';
      UNLOAD ('SELECT * FROM part')   
      TO 's3://bucket_name/unload_from_redshift/part_parquet/part_' 
      FORMAT AS PARQUET 
      IAM_ROLE 'arn:aws:iam::xxxx:role/redshift_s3_role';
      UNLOAD ('SELECT * FROM partsupp')   
      TO 's3://bucket_name/unload_from_redshift/partsupp_parquet/partsupp_' 
      FORMAT AS PARQUET 
      IAM_ROLE 'arn:aws:iam::xxxx:role/redshift_s3_role';
      UNLOAD ('SELECT * FROM region')   
      TO 's3://bucket_name/unload_from_redshift/region_parquet/region_' 
      FORMAT AS PARQUET 
      IAM_ROLE 'arn:aws:iam::xxxx:role/redshift_s3_role';
      UNLOAD ('SELECT * FROM supplier')   
      TO 's3://bucket_name/unload_from_redshift/supplier_parquet/supplier_' 
      FORMAT AS PARQUET 
      IAM_ROLE 'arn:aws:iam::xxxx:role/redshift_s3_role';
      说明

      编辑器支持一次提交多条UNLOAD命令。

    3. 登录S3控制台,在S3的Bucket目录下检查导出的数据。

      格式为符合预期的PARQUET格式。检查导出数据

步骤二:将导出至S3的数据迁移至对象存储服务OSS

MaxCompute支持通过OSS的在线迁移上云服务,将S3的数据迁移至OSS,详情请参见AWS S3迁移教程

  1. 登录OSS管理控制台,创建保存迁移数据的Bucket,详情请参见控制台创建存储空间

    Bucket

  2. 创建RAM用户并授予相关权限。

    1. 登录RAM访问控制台,创建RAM用户,详情请参见创建RAM用户

    2. 选中新创建的用户登录名称,单击添加权限,为新创建的RAM用户授予AliyunOSSFullAccess(存储空间读写权限)和AliyunMGWFullAccess(在线迁移权限),单击确定 > 完成

    3. 在左侧导航栏,单击概览。在概览页面的账号管理区域,单击用户登录地址链接,使用新创建的RAM用户登录阿里云控制台。

  3. 在AWS侧准备可编程及访问S3的IAM用户。具体操作,请参见IAM用户

    1. 登录S3控制台

    2. 在导出的数据目录上单击右键,选择获取总大小,获取迁移目录的数据大小和文件个数。

      • 获取总大小获取总大小

      • 获取迁移目录的数据大小和文件个数数据大小和文件数量

    3. 登录IAM用户控制台,单击添加用户

      IAM用户控制台

    4. 添加用户页面,配置用户名。在选择AWS访问类型区域,选中编程访问,单击下一步:权限

      配置用户信息

    5. 添加用户页面,单击直接附加现有策略。在搜索框中输入S3,选中AmazonS3ReadOnlyAccess策略,单击下一步:标签

      配置用户策略

    6. 单击下一步:审核 > 创建用户,完成IAM用户创建并记录密钥信息。

      创建在线迁移任务时会使用该密钥信息。完成用户创建

  4. 登录阿里云在线迁移服务管理控制台,创建在线迁移数据地址。

    1. 在左侧导航栏,选择在线迁移服务 > 地址管理,单击新建地址。

    2. 管理数据地址页面,单击创建数据地址,配置数据源及目标地址相关参数,单击确定。参数详情请参见迁移实施

      说明

      其中Access Key IDAccess Key Secret为IAM用户的密钥信息。

  5. 登录阿里云在线迁移服务管理控制台,创建在线迁移任务。

    1. 在左侧导航栏,选择在线迁移服务 > 迁移任务,单击新建任务

    2. 选择地址页面,配置如下参数,然后单击下一步

      参数

      是否必选

      说明

      名称

      输入迁移任务名称。名称命名规则如下:

      • 名称不能为空,长度为3~63个字符。

      • 支持英文小写字母、数字和特殊字符短划线(-)和下划线(_),且区分大小写。

      • UTF-8编码并且不能以短划线(-)和下划线(_)开头。

      源地址

      选择已创建的源地址。

      目的地址

      选择已创建的目的地址。

    3. 配置任务页面,配置如下参数。

      参数

      是否必选

      说明

      迁移带宽

      选择迁移带宽。

      • 默认:默认最大带宽,实际速度取决于文件大小和文件数量。

      • 指定上限:根据控制台提示指定具体的带宽上限。

      重要
      • 实际迁移带宽与数据源、网络、目的限流、文件大小等因素有关,不一定能达到指定上限。

      • 请您评估数据源、迁移目的、业务情况、网络带宽等,并根据实际情况选择合理数值,限流不恰当可能会影响业务的正常运行。

      每秒迁移文件数

      选择每秒迁移文件数。

      • 默认:默认每秒迁移文件数。

      • 指定上限:根据控制台提示指定具体的每秒迁移文件数。

      重要
      • 实际迁移带宽与数据源、网络、目的限流、文件大小等因素有关,不一定能达到指定上限。

      • 请您评估数据源、迁移目的、业务情况、网络带宽等,并根据实际情况选择合理数值,限流不恰当可能会影响业务的正常运行。

      覆盖方式

      选择同名文件的覆盖方式。

      • 不覆盖:不迁移该文件。

      • 全部覆盖:源地址中的文件会覆盖目的地址中的文件。

      • 根据最后修改时间覆盖

        • 当源地址中的文件最后修改时间晚于目的地址中的文件最后修改时间时,目的地址中的文件会被覆盖。

        • 当源地址中的文件最后修改时间与目的地址中的文件最后修改时间相同时,若二者的Size和Content-Type有一项不同,则目的地址中的文件会被覆盖。

      • 警告
        • 根据最后修改时间覆盖无法严格保证一定不会覆盖更新的文件,存在旧文件覆盖新文件的风险。

        • 若您选择根据最后修改时间覆盖的覆盖方式,请务必确保源端文件能返回最后修改时间SizeContent-Type等信息,否则覆盖策略可能失效,产生非预期的迁移结果。

      迁移日志

      迁移日志推送方式。

      • 不推送(默认):不推送迁移日志。

      • 推送:将迁移日志推送至日志服务SLS,可在SLS上查看迁移日志。

      • 仅推送文件错误日志:仅将错误迁移日志推送至日志服务SLS,可在SLS上查看错误迁移日志。

      当选择推送仅推送文件错误日志时,在线迁移服务会在日志服务SLS中创建名称为aliyun-oss-import-log-阿里云账号ID-当前控制台地域的Project,例如aliyun-oss-import-log-137918634953****-cn-hangzhou。

      重要

      请务必完成以下操作后,再选择推送仅推送文件错误日志,否则可能会导致迁移任务异常。

      • 已开通SLS服务。

      • 已在日志服务授权项授权页面中同意授权。

      日志服务授权

      迁移日志选择推送仅推送文件错误日志时出现该选项。

      单击授权进入云资源访问授权页面,页面会对应创建AliyunOSSImportSlsAuditRole角色,并对角色做授权,请单击同意授权完成授权。

      文件名

      文件名过滤器。

      支持包含排除两种过滤规则,请参见RE2库的正则表达式语法(仅支持部分表达式语法)。例如:

      • .*\.jpg$表示以.jpg结尾的所有文件。

      • ^file.*默认表示根目录下以file开头的所有文件。

        如果源数据地址设置了前缀,例如源数据地址前缀为data/to/oss/,则需要使用^data/to/oss/file.*来匹配指定前缀下以file开头的所有文件。

      • .*/picture/.*表示匹配某一级为picture的子目录。

      重要
      • 当过滤规则为包含时,符合规则的文件都会被迁移,如果有多条规则,符合任意一个条件的文件都会被迁移。

        例如2个文件picture.jpgpicture.png,设置一条包含规则过滤.*\.jpg$,此时只会迁移picture.jpg文件,如果同时也设置了包含规则过滤.*\.png$,则2个文件都会被迁移。

      • 当过滤规则为排除时,符合规则的文件都不会被迁移,如果有多条规则,符合任意一个条件的文件都不会被迁移。

        例如2个文件picture.jpgpicture.png,设置一条排除规则过滤.*\.jpg$,此时只会迁移picture.png,如果同时也设置了排除规则过滤.*\.png$,则2个文件都不会被迁移。

      • 排除规则优先。当一个文件既在排除规则中又在包含规则中,则文件不会被迁移。

        例如文件file.txt,设置排除规则过滤.*\.txt$文件,并同时设置包含规则过滤file.*,则此时file.txt文件不会被迁移。

      文件修改时间

      文件最后一次修改时间过滤器。

      可指定文件最后一次修改时间作为过滤规则。如果指定了时间范围,则只迁移文件最后一次修改时间在指定时间范围内的文件,具体规则如下。

      • 当仅指定开始时间为2019年01月01日,不指定结束时间时,则只迁移文件最后一次修改时间晚于等于2019年01月01日的文件。

      • 当仅指定结束时间为2022年01月01日,不指定开始时间时,则只迁移文件最后一次修改时间早于等于2022年01月01日的文件。

      • 当指定开始时间为2019年01月01日,结束时间为2022年01月01日,则迁移文件最后一次修改时间范围在晚于等于2019年01月01日,且早于等于2022年01月01日的文件。

      执行时间

      重要

      正在迁移中的任务,在下一个指定时间前仍未结束本轮迁移,则会在本轮迁移结束后,自动顺延至下一个指定时间启动任务,直至完成指定次数的迁移。

      确定迁移任务的执行时间。

      • 立即执行:立即执行当前任务。

      • 指定执行时间:指定任务执行期间每天的执行时间段。默认情况下,任务将在指定的起始时间启动,在指定的停止时间暂停。

      • 周期调度:通过调整执行频率和执行次数来启动任务。

        • 执行频率:支持以每小时、每天、每周、一周中某些天、自定义等5种频率,具体请查看执行频率参考

        • 执行次数:指定任务的执行次数,如不设置则默认执行一次,最大执行次数请参考控制台提示。

    4. 阅读在线迁移服务协议,选中我已理解并确认,合规承诺声明且当迁移任务完成时,我有确认迁移数据一致性的义务和责任,然后单击下一步

    5. 检查配置信息,确认无误后,单击确定,等待迁移任务执行。

    迁移任务创建完成后,任务状态为结束表示迁移任务已结束,可以登录OSS管理控制台,在Bucket页面,单击文件管理,查看文件迁移结果。

    OSS目录迁移结果

步骤三:将数据从OSS迁移至同区域的MaxCompute项目

您可以通过MaxCompute的LOAD命令将OSS数据迁移至同区域的MaxCompute项目中。

LOAD命令支持STS认证和AccessKey认证两种方式,AccessKey认证方式需要使用明文的AccessKey ID和AccessKey Secret。STS认证方式不会暴露AccessKey信息,具备高安全性。本文以STS认证方式为例介绍数据迁移操作。

  1. 在DataWorks的临时查询界面或MaxCompute客户端(odpscmd),使用Redshift集群数据的DDL,创建与迁移数据相对应的表。

    临时查询功能详情请参见使用临时查询运行SQL语句(可选)。命令示例如下。

    CREATE TABLE customer(
    C_CustKey int ,
    C_Name varchar(64) ,
    C_Address varchar(64) ,
    C_NationKey int ,
    C_Phone varchar(64) ,
    C_AcctBal decimal(13, 2) ,
    C_MktSegment varchar(64) ,
    C_Comment varchar(120) ,
    skip varchar(64)
    );
    CREATE TABLE lineitem(
    L_OrderKey int ,
    L_PartKey int ,
    L_SuppKey int ,
    L_LineNumber int ,
    L_Quantity int ,
    L_ExtendedPrice decimal(13, 2) ,
    L_Discount decimal(13, 2) ,
    L_Tax decimal(13, 2) ,
    L_ReturnFlag varchar(64) ,
    L_LineStatus varchar(64) ,
    L_ShipDate timestamp ,
    L_CommitDate timestamp ,
    L_ReceiptDate timestamp ,
    L_ShipInstruct varchar(64) ,
    L_ShipMode varchar(64) ,
    L_Comment varchar(64) ,
    skip varchar(64)
    );
    CREATE TABLE nation(
    N_NationKey int ,
    N_Name varchar(64) ,
    N_RegionKey int ,
    N_Comment varchar(160) ,
    skip varchar(64)
    );
    CREATE TABLE orders(
    O_OrderKey int ,
    O_CustKey int ,
    O_OrderStatus varchar(64) ,
    O_TotalPrice decimal(13, 2) ,
    O_OrderDate timestamp ,
    O_OrderPriority varchar(15) ,
    O_Clerk varchar(64) ,
    O_ShipPriority int ,
    O_Comment varchar(80) ,
    skip varchar(64)
    );
    CREATE TABLE part(
    P_PartKey int ,
    P_Name varchar(64) ,
    P_Mfgr varchar(64) ,
    P_Brand varchar(64) ,
    P_Type varchar(64) ,
    P_Size int ,
    P_Container varchar(64) ,
    P_RetailPrice decimal(13, 2) ,
    P_Comment varchar(64) ,
    skip varchar(64)
    );
    CREATE TABLE partsupp(
    PS_PartKey int ,
    PS_SuppKey int ,
    PS_AvailQty int ,
    PS_SupplyCost decimal(13, 2) ,
    PS_Comment varchar(200) ,
    skip varchar(64)
    );
    CREATE TABLE region(
    R_RegionKey int ,
    R_Name varchar(64) ,
    R_Comment varchar(160) ,
    skip varchar(64)
    );
    CREATE TABLE supplier(
    S_SuppKey int ,
    S_Name varchar(64) ,
    S_Address varchar(64) ,
    S_NationKey int ,
    S_Phone varchar(18) ,
    S_AcctBal decimal(13, 2) ,
    S_Comment varchar(105) ,
    skip varchar(64)
    );

    本文的TPC-H数据集使用MaxCompute 2.0数据类型和Decimal 2.0数据类型,所以创建的项目为MaxCompute 2.0版本。如果您的项目需要设置使用2.0数据类型,请在命令前添加如下语句一起提交执行。

    setproject odps.sql.type.system.odps2=true;
    setproject odps.sql.decimal.odps2=true;
  2. 创建具备访问OSS权限的RAM角色并授权。详情请参见STS模式授权

  3. 分次执行LOAD命令,将OSS的全部数据加载至创建的MaxCompute表中,并执行SQL命令查看和校验数据导入结果。LOAD命令详情请参见LOAD

    LOAD OVERWRITE TABLE orders 
    FROM  LOCATION 'oss://endpoint/oss_bucket_name/unload_from_redshift/orders_parquet/' --OSS存储空间位置。
    ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
    WITH SERDEPROPERTIES ('odps.properties.rolearn'='acs:ram::xxx:role/xxx_role')
    STORED AS PARQUET;

    执行如下命令查看和校验数据导入结果。

    SELECT * FROM orders limit 100;

    返回结果示例如下。查询导入结果

  4. 通过表的数量、记录的数量和典型作业的查询结果,校验迁移至MaxCompute的数据是否和Redshift集群的数据一致。

    1. 登录Amazon Redshift控制台,在右上角选择区域为亚太地区(新加坡)。在左侧导航栏,单击编辑器,输入如下命令执行查询操作。

      SELECT l_returnflag, l_linestatus, SUM(l_quantity) as sum_qty,
      SUM(l_extendedprice) AS sum_base_price, SUM(l_extendedprice*(1-l_discount)) AS sum_disc_price,
      SUM(l_extendedprice*(1-l_discount)*(1+l_tax)) AS sum_charge, AVG(l_quantity) AS avg_qty,
      AVG(l_extendedprice) AS avg_price, AVG(l_discount) AS avg_disc,  COUNT(*) AS count_order
      FROM lineitem
      GROUP BY l_returnflag, l_linestatus
      ORDER BY l_returnflag,l_linestatus;

      返回结果示例如下。AWS查询结果

    2. 通过DataWorks的临时查询界面或MaxCompute客户端(odpscmd),执行上述命令,验证返回结果是否与Redshift集群的返回结果一致。

      返回结果示例如下。临时查询结果