本文为您介绍如何通过公网环境将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数据导出至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用户。
    1. 登录S3控制台
    2. 在导出的数据目录上单击右键,选择获取总大小,获取迁移目录的数据大小和文件个数。
      • 获取总大小获取总大小
      • 获取迁移目录的数据大小和文件个数数据大小和文件数量
    3. 登录IAM用户控制台,单击添加用户
      IAM用户控制台
    4. 添加用户页面,配置用户名。在选择AWS访问类型区域,选中编程访问,单击下一步:权限
      配置用户信息
    5. 添加用户页面,单击直接附加现有策略。在搜索框中输入S3,选中AmazonS3ReadOnlyAccess策略,单击下一步:标签
      配置用户策略
    6. 单击下一步:审核 > 创建用户,完成IAM用户创建并记录密钥信息。
      创建在线迁移任务时会使用该密钥信息。完成用户创建
  4. 创建在线迁移数据地址。
    1. 登录阿里云数据在线迁移控制台。在左侧导航栏,单击数据地址
    2. 可选:如果未开通在线迁移服务,请在弹出的对话框中单击去申请。在在线迁移公测申请页面,填写信息,并单击提交
      在线迁移公测申请
    3. 管理数据地址页面,单击创建数据地址,配置数据源及目标地址相关参数,单击确定。参数详情请参见迁移实施
      • 数据源创建源数据地址
        说明 Access Key IDAccess Key Secret为IAM用户的密钥信息。
      • 目标地址创建目标地址
        说明 Access Key IDAccess Key Secret为RAM用户的密钥信息。
  5. 创建在线迁移任务。
    1. 在左侧导航栏,单击迁移任务
    2. 迁移任务列表页面,单击创建迁移任务,配置相关信息后,单击创建。参数详情请参见迁移实施
      • 任务配置任务配置
      • 性能调优性能调优
        说明 待迁移存储量待迁移文件个数是您通过S3控制台获取到的待迁移数据大小和文件个数。
    3. 创建的迁移任务会自动运行。请您确认任务状态已完成,表示迁移任务成功结束。
      迁移任务完成
    4. 在迁移任务的右侧单击管理,查看迁移任务报告,确认数据已经全部迁移成功。
      迁移报告
    5. 登录OSS管理控制台
    6. 在左侧导航栏,单击Bucket列表。在Bucket列表区域单击创建的Bucket。在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集群的返回结果一致。
      返回结果示例如下。临时查询结果