本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
本文为您介绍如何通过公网环境将Amazon Redshift数据迁移至MaxCompute。
前提条件
准备Amazon Redshift集群环境及数据环境。
您可以登录AWS官网,获取创建Redshift集群的详细操作内容,详情请参见Amazon Redshift集群管理指南。
创建Redshift集群。如果已有Redshift集群,您可以直接使用已有的Redshift集群。
在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格式为例介绍数据迁移操作。
新建Redshift类型的IAM角色。
登录IAM控制台,单击创建角色。
在创建角色页面的选择一个使用案例区域,单击Redshift。在选择您的使用案例区域单击Redshift-Customizable后,单击下一步:权限。
添加读写S3的权限策略。在创建角色页面的Attach权限策略区域,输入S3,选中AmazonS3FullAccess,单击下一步:标签。
为IAM角色命名并完成IAM角色创建。
单击下一步:审核,在创建角色页面的审核区域,配置角色名称和角色描述,单击创建角色,完成IAM角色创建。
返回IAM控制台,在搜索框输入redshift_s3_role,单击redshift_s3_role角色名称,获取并记录角色ARN。
执行UNLOAD命令迁移数据时会使用角色ARN访问S3。
为Redshift集群添加创建好的IAM角色,获取访问S3的权限。
登录Amazon Redshift控制台,在右上角选择区域为亚太地区(新加坡)。
在左侧导航栏,单击集群,选中已创建好的Redshift集群,在操作下拉列表选择管理IAM角色。
在管理IAM角色页面,单击搜索框右侧的图标,选择redshift_s3_role。单击 ,将具备S3访问权限的redshift_s3_role添加至Redshift集群。
将Amazon Redshift数据导出至S3。
在左侧导航栏,单击编辑器,执行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命令。
登录S3控制台,在S3的Bucket目录下检查导出的数据。
格式为符合预期的PARQUET格式。
步骤二:将导出至S3的数据迁移至对象存储服务OSS
MaxCompute支持通过OSS的在线迁移上云服务,将S3的数据迁移至OSS,详情请参见AWS S3迁移教程。
登录OSS管理控制台,创建保存迁移数据的Bucket,详情请参见控制台创建存储空间。
创建RAM用户并授予相关权限。
在AWS侧准备可编程及访问S3的IAM用户。具体操作,请参见IAM用户。
登录阿里云在线迁移服务管理控制台,创建在线迁移数据地址。
在左侧导航栏,选择
,单击新建地址。在管理数据地址页面,单击创建数据地址,配置数据源及目标地址相关参数,单击确定。参数详情请参见迁移实施。
说明其中Access Key ID和Access Key Secret为IAM用户的密钥信息。
登录阿里云在线迁移服务管理控制台,创建在线迁移任务。
在左侧导航栏,选择在线迁移服务 > 迁移任务,单击新建任务。
在选择地址页面,配置如下参数,然后单击下一步。
参数
是否必选
说明
名称
是
输入迁移任务名称。名称命名规则如下:
名称不能为空,长度为3~63个字符。
支持英文小写字母、数字和特殊字符短划线(-)和下划线(_),且区分大小写。
UTF-8编码并且不能以短划线(-)和下划线(_)开头。
源地址
是
选择已创建的源地址。
目的地址
是
选择已创建的目的地址。
在配置任务页面,配置如下参数。
参数
是否必选
说明
迁移带宽
否
选择迁移带宽。
默认:默认最大带宽,实际速度取决于文件大小和文件数量。
指定上限:根据控制台提示指定具体的带宽上限。
重要实际迁移带宽与数据源、网络、目的限流、文件大小等因素有关,不一定能达到指定上限。
请您评估数据源、迁移目的、业务情况、网络带宽等,并根据实际情况选择合理数值,限流不恰当可能会影响业务的正常运行。
每秒迁移文件数
否
选择每秒迁移文件数。
默认:默认每秒迁移文件数。
指定上限:根据控制台提示指定具体的每秒迁移文件数。
重要实际迁移带宽与数据源、网络、目的限流、文件大小等因素有关,不一定能达到指定上限。
请您评估数据源、迁移目的、业务情况、网络带宽等,并根据实际情况选择合理数值,限流不恰当可能会影响业务的正常运行。
覆盖方式
否
选择同名文件的覆盖方式。
不覆盖:不迁移该文件。
全部覆盖:源地址中的文件会覆盖目的地址中的文件。
根据最后修改时间覆盖:
当源地址中的文件最后修改时间晚于目的地址中的文件最后修改时间时,目的地址中的文件会被覆盖。
当源地址中的文件最后修改时间与目的地址中的文件最后修改时间相同时,若二者的Size和Content-Type有一项不同,则目的地址中的文件会被覆盖。
根据最后修改时间覆盖无法严格保证一定不会覆盖更新的文件,存在旧文件覆盖新文件的风险。
若您选择根据最后修改时间覆盖的覆盖方式,请务必确保源端文件能返回最后修改时间、Size、Content-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.jpg和picture.png,设置一条包含规则过滤.*\.jpg$,此时只会迁移picture.jpg文件,如果同时也设置了包含规则过滤.*\.png$,则2个文件都会被迁移。
当过滤规则为排除时,符合规则的文件都不会被迁移,如果有多条规则,符合任意一个条件的文件都不会被迁移。
例如2个文件picture.jpg和picture.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种频率,具体请查看执行频率参考。
执行次数:指定任务的执行次数,如不设置则默认执行一次,最大执行次数请参考控制台提示。
阅读在线迁移服务协议,选中我已理解并确认,合规承诺声明且当迁移任务完成时,我有确认迁移数据一致性的义务和责任,然后单击下一步。
检查配置信息,确认无误后,单击确定,等待迁移任务执行。
迁移任务创建完成后,任务状态为结束表示迁移任务已结束,可以登录OSS管理控制台,在Bucket页面,单击文件管理,查看文件迁移结果。
步骤三:将数据从OSS迁移至同区域的MaxCompute项目
您可以通过MaxCompute的LOAD命令将OSS数据迁移至同区域的MaxCompute项目中。
LOAD命令支持STS认证和AccessKey认证两种方式,AccessKey认证方式需要使用明文的AccessKey ID和AccessKey Secret。STS认证方式不会暴露AccessKey信息,具备高安全性。本文以STS认证方式为例介绍数据迁移操作。
在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;
创建具备访问OSS权限的RAM角色并授权。详情请参见STS模式授权。
分次执行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;
返回结果示例如下。
通过表的数量、记录的数量和典型作业的查询结果,校验迁移至MaxCompute的数据是否和Redshift集群的数据一致。
登录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;
返回结果示例如下。
通过DataWorks的临时查询界面或MaxCompute客户端(odpscmd),执行上述命令,验证返回结果是否与Redshift集群的返回结果一致。
返回结果示例如下。