本文将介绍如何经过公网环境迁移Amazon Redshift数据到阿里云MaxCompute服务当中。html
本方案的整体迁移流程以下:web
第一, 将Amazon Redshift 中的数据导出到Amazon S3存储上;sql
第二, 借助阿里云在线迁移服务(Data Online Migration)从AWS S3将数据迁移到阿里云OSS上;数据库
第三, 将数据从阿里云OSS加载到同Region的MaxCompute项目中,并进行校验数据完整性。apache
· 准备Redshift的集群环境及数据环境;编程
使用已有的Redshift集群或建立新的Redshift集群:安全
**
**session
在Redshift集群中准备好须要迁移的数据,本方案中在public schema中准备了TPC-H数据集进行方案介绍:工具
· 准备MaxCompute的项目环境;oop
在阿里云Region建立MaxCompute项目,这里以新加坡Region为例,建立了做为迁移目标的MaxCompute项目:
AWS Redshift支持Role-based access control和Key-based access control两种认证方式实现Redshift UNLOAD命令写入数据到S3。
基于IAM Role的UNLOAD命令:
unload ('select * from venue') to 's3://mybucket/tickit/unload/venue_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
基于access_key的UNLOAD命令:
unload ('select * from venue') to 's3://mybucket/tickit/venue_' access_key_id '' secret_access_key '' session_token '';
相关语法及说明可参考Redshift官方文档关于UNLOAD到S3的介绍。
本方案选择使用IAM Role方式进行数据导出。
unload默认导出数据的格式为 | 符合分隔的文本文件,命令以下: unload ('select * from customer') to 's3://xxx-bucket/unload_from_redshift/customer/customer_' iam_role 'arn:aws:iam::xxx:role/redshift_s3_role';
执行成功后,在S3对应的bucket目录下能够查到文件文件:
文件样例以下:
Unload同时支持以Parquet格式导出到S3,便于其余分析引擎直接进行读取消费:
unload ('select * from customer') to 's3://xxx-bucket/unload_from_redshift/customer_parquet/customer_' FORMAT AS PARQUET iam_role 'arn:aws:iam::xxxx:role/redshift_s3_role';
执行成功后,s3对应bucket目录下生成了parquet格式的文件。
得益于Parquet文件的数据压缩特性,能够看到Parquet文件比文本文件大小更小,本方案选择Parquet格式做为数据导出和跨云迁移的数据格式。
进入https://console.aws.amazon.com/iam/home?region=ap-southeast-1#/roles(以新加坡Region为例)建立角色。
建立角色时,” Choose a use case”选择Redshift服务,并选择Redshift-Customizable的”use case”
” Attach permissions policies”时,添加具有写S3的Policy,本方案选择使用” AmazonS3FullAccess”。
本方案中命名为redshift_s3_role
打开刚定义的role并复制角色ARN,unload命令将会使用该Role ARN访问S3.
进入Redshift集群列表,选择须要迁移的集群,在”Action”列表中选择”Manage IAM Role”菜单,进行IAM角色的关联。
将已经成功建立的具有访问S3权限的IAM Role角色添加到集群可用IAM roles列表以获取Redshift对S3读写的权限并保存生效:
查看添加的IAM roles,确认集群已经添加了前文建立的redshift_s3_role角色。
使用unload命令将Redshift数据库中须要迁移的表以Parquet格式导出到S3对应的目录下。
命令以下(须要替换目录及iam role信息):
`unload ('select * from customer') to 's3://xxx-bucket/unload_from_redshift/customer_parquet/customer_' FORMAT AS PARQUET iam_role 'arn:aws:iam::xxx:role/redshift_s3_role';` `unload ('select * from orders') to 's3://xxx-bucket/unload_from_redshift/orders_parquet/orders_' FORMAT AS PARQUET iam_role 'arn:aws:iam::xxx:role/redshift_s3_role';` `unload ('select * from lineitem') to 's3://xxx-bucket/unload_from_redshift/lineitem_parquet/lineitem_' FORMAT AS PARQUET iam_role 'arn:aws:iam::xxx:role/redshift_s3_role';` `unload ('select * from nation') to 's3://xxx-bucket/unload_from_redshift/nation_parquet/nation_' FORMAT AS PARQUET iam_role 'arn:aws:iam::xxx:role/redshift_s3_role';` `unload ('select * from part') to 's3://xxx-bucket/unload_from_redshift/part_parquet/part_' FORMAT AS PARQUET iam_role 'arn:aws:iam::xxx:role/redshift_s3_role';` `unload ('select * from partsupp') to 's3://xxx-bucket/unload_from_redshift/partsupp_parquet/partsupp_' FORMAT AS PARQUET iam_role 'arn:aws:iam::xxx:role/redshift_s3_role';` `unload ('select * from region') to 's3://xxx-bucket/unload_from_redshift/region_parquet/region_' FORMAT AS PARQUET iam_role 'arn:aws:iam::xxx:role/redshift_s3_role';` `unload ('select * from supplier') to 's3://xxx-bucket/unload_from_redshift/supplier_parquet/supplier_' FORMAT AS PARQUET iam_role 'arn:aws:iam::xxx:role/redshift_s3_role';`
经过Redshift的Editor(客户端工具一样能够提交,客户端工具支持一次提交多行unload命令)提交导出数据到S3命令:
在S3对应的bucke目录下检查导出的数据:
保存的格式为符合预期的Parquet格式:
阿里云在线迁移服务支持迁移其余云厂商对象存储数据到阿里云OSS,其中对于在线迁移服务介绍以及S3到OSS的迁移介绍能够参考阿里云官方文档。
目前在线迁移服务处于公测状态,须要工单申请、开放后才可以使用。
1.在阿里云侧,须要在目标region准备好须要保存迁移数据的OSS目录:
· 登陆RAM 控制台。
· 在左侧导航栏,单击人员管理 > 用户 > 建立用户。
· 选中控制台密码登陆和编程访问,以后填写用户帐号信息。
· 保存生成的帐号、密码、AccessKeyID 和 AccessKeySecret。
· 选中用户登陆名称,单击添加权限,授予子帐号存储空间读写权限(AliyunOSSFullAccess)和在线迁移管理权限(AliyunMGWFullAccess)。
· 受权完成后,在左侧导航栏,单击概览 > 用户登陆地址连接,使用刚建立的 RAM 子帐号的用户名和密码进行登陆。
· 预估迁移数据,进入管控台中确认S3中有的存储量与文件数量。
· 建立编程访问S3的IAM帐号
1.进入IAM,选择建立用户。
2.为新建用户添加读取S3的权限
赋予AmazonS3ReadOnlyAccess权限。
3.记录AK信息,在数据迁移中会用到。
进入OSS web-console页面,进入对象存储的”数据导入”功能菜单:
点击”Data Online Migration”菜单,进入在线数据迁移工具页面:
公测期间如未开通,须要填写申请表单进行申请,开通后可以使用在线迁移服务。
开通后,按如下步骤建立在线数据迁移任务。
进入数据地址(“Data Access”)页面,点击”建立数据地址(Create Data Access)”按钮,开始建立源和目标数据源。
【建立源地址:】
其中:
· 数据类型选择:AWS-S3
· Data Name:填写数据源的别名
· Endpoint:填写S3的Endpoint(Endpoint选择参考)
· Bucket:填写从Redshift unload到S3所在的bucket名称
· Prefix:本方案中将全部Redshift数据导出到同一个目录unload_from_redshift下,填写该目录,迁移该目录下全部数据
· Access Key Id:填写具有访问AWS S3该Bucket目录权限的帐号的Access Key Id(使用前文提到的AWS侧可编程访问的IAM帐号身份)
· Secret Access Key: 填写具有访问AWS S3该Bucket目录权限的帐号的Secret Access Key(使用前文提到的AWS侧可编程访问的IAM帐号身份)
保存数据源定义:
【建立目标地址:】
其中:
• 数据类型选择:OSS
• Data Name:填写数据源的别名
• Endpoint:填写oss的Endpoint
• Bucket:填写迁移目标的OSS的bucket名称
• Prefix:填写迁移目标bucket,本方案将迁移数据写入unload_from_redshift下
• Access Key Id:填写具有访问OSS该Bucket目录权限的帐号的Access Key Id(使用前文提到的阿里云对象存储OSS准备章节中的帐号身份)
• Secret Access Key: 填写具有访问OSS该Bucket目录权限的帐号的Secret Access Key(使用前文提到的阿里云对象存储OSS准备章节中的帐号身份)
保存数据源定义:
从左侧tab页面中找到迁移任务,并进入页面,点击建立迁移任务。
定义迁移任务的任务信息:
· 源数据地址填写已经定义的s3数据源;
· 目标地址填写已经定义的oss数据源;
· 本次选择全量迁移的迁移类型;
点击Next,定义做业传输性能相关参数:
这里须要填写迁移的数据大小和文件个数。可经过S3的控制台,右键查看目录的属性,获取迁移目录的数据大小和文件个数并填写到做业参数当中。
完成迁移任务建立后,可在迁移任务列表中查看已经建立好的迁移做业:
做业提交后会在自动运行,经过查看Jobe Status查看做业状态,Finished表明迁移任务成功结束。
点击做业的”Manage”按钮能够查看做业运行状况。
进入到目标OSS的目录,查看数据迁移的结果。
目录及文件所有已从S3迁移到OSS。
经过在线迁移服务,咱们将AWS Redshift的导出的数据从S3迁移到了阿里云OSS,下面将利用MaxCompute LOAD命令将OSS数据加载到MaxCompute项目中。
在DataWorks临时查询界面或MaxCompute命令行工具odpscmd中,使用Redshift集群数据的DDL在MaxCompute中建立对应的内表。
示例以下:
--MaxCompute DDL 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数据集须要使用MaxCompute2.0数据类型和Decimal2.0数据类型,在建立数据表前须要检查并设置使用2.0数据类型:
setproject odps.sql.type.system.odps2=true;
setproject odps.sql.decimal.odps2=true;
LOAD命令支持STS认证和AccessKey认证两种方式,AccessKey方式须要使用明文AccessKey/ AccessKey Secret,例如:
LOAD overwrite table orders from LOCATION 'oss:// :@oss-ap-southeast-1-internal.aliyuncs.com/sg-migration/unload_from_redshift/orders_parquet/' ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS PARQUET;
STS受权认证不暴露AccessKey信息,使用更安全,本方案将使用STS方式知足MaxCompute加载OSS数据的跨服务受权须要。
使用STS认证方式加载OSS数据前,您须要:
1.建立能够读取OSS的阿里云RAM Role
在查询OSS上数据以前,须要对将OSS的数据相关权限赋给MaxCompute的访问帐号,受权详见受权文档。
本方案中建立了具有” AliyunOSSFullAccess”权限policy的ram角色。
编辑配置该ram角色的信任策略,容许MaxCompute服务(Service:odps.aliyuncs.com)能够扮演使用该角色。
MaxCompute提供了LOAD命令,经过LOAD命令可实现OSS数据加载到MaxCompute内表的功能。
LOAD overwrite table orders` from LOCATION 'oss://endpoint/bucket/unload_from_redshift/orders_parquet/' 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;
其中:
· 'odps.properties.rolearn'使用前文建立的ram角色的arn
· STORED AS PARQUET:OSS的文件为Parquet格式,使用STORED AS PARQUET申明导入格式为Parquet。
导入成功后,能够经过SQL命令查看和校验数据导入结果:
经过执行多个LOAD脚本方式将OSS的所有数据迁移到MaxCompute项目中。
您能够经过表的数量、记录的数量、典型做业的查询结果来校验迁移到MaxCompute的数据是否和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或者MaxCompte命令行执行与Redshift相同的Query验证数据一致性:
本文为阿里云原创内容,未经容许不得转载。