1 计划概述
本文将介绍如何通过公网环境迁徙Amazon Redshift数据到阿里云MaxCompute服务当中。
本计划的总体迁徙流程如下:
第一, 将Amazon Redshift 中的数据导出到Amazon S3存储上;
第二, 借助阿里云在线迁徙服务(Data Online Migration)从AWS S3将数据迁徙到阿里云OSS上;
第三, 将数据从阿里云OSS加载到同Region的MaxCompute我的项目中,并进行校验数据完整性。
2 前提条件
· 筹备Redshift的集群环境及数据环境;
应用已有的Redshift集群或创立新的Redshift集群:
**
**
在Redshift集群中筹备好须要迁徙的数据,本计划中在public schema中筹备了TPC-H数据集进行计划介绍:
· 筹备MaxCompute的我的项目环境;
在阿里云Region创立MaxCompute我的项目,这里以新加坡Region为例,创立了作为迁徙指标的MaxCompute我的项目:
3 Redshift导出数据到S3
3.1 Unload简介
3.1.1 命令介绍
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形式进行数据导出。
3.1.2 默认格局导出
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目录下能够查到文件文件:
文件样例如下:
3.1.3 Parquet格局导出
Unload同时反对以Parquet格局导出到S3,便于其余剖析引擎间接进行读取生产:
unload ('select * from customer')to 's3://xxx-bucket/unload_from_redshift/customer_parquet/customer_'FORMAT AS PARQUETiam_role 'arn:aws:iam::xxxx:role/redshift_s3_role';
执行胜利后,s3对应bucket目录下生成了parquet格局的文件。
得益于Parquet文件的数据压缩个性,能够看到Parquet文件比文本文件大小更小,本计划抉择Parquet格局作为数据导出和跨云迁徙的数据格式。
3.2 创立能够读写S3的IAM 角色
3.2.1 新建Redshift use case的IAM角色
进入https://console.aws.amazon.com/iam/home?region=ap-southeast-1#/roles(以新加坡Region为例)创立角色。
创立角色时,” Choose a use case”抉择Redshift服务,并抉择Redshift-Customizable的”use case”
3.2.2 增加读写S3的权限策略
” Attach permissions policies”时,增加具备写S3的Policy,本计划抉择应用” AmazonS3FullAccess”。
3.2.3为IAM Role命名并实现IAM 角色创立
本计划中命名为redshift_s3_role
关上刚定义的role并复制角色ARN,unload命令将会应用该Role ARN拜访S3.
3.2.4Redshift集群增加IAM Role以获取拜访S3权限
进入Redshift集群列表,抉择须要迁徙的集群,在”Action”列表中抉择”Manage IAM Role”菜单,进行IAM角色的关联。
将曾经胜利创立的具备拜访S3权限的IAM Role角色增加到集群可用IAM roles列表以获取Redshift对S3读写的权限并保留失效:
查看增加的IAM roles,确认集群曾经增加了前文创立的redshift_s3_role角色。
3.3 卸载数据到Amazon S3
应用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格局:
4 迁徙AWS S3数据到阿里云OSS
4.1 在线迁徙服务实现S3到OSS迁徙
阿里云在线迁徙服务反对迁徙其余云厂商对象存储数据到阿里云OSS,其中对于在线迁徙服务介绍以及S3到OSS的迁徙介绍能够参考阿里云官网文档。
目前在线迁徙服务处于公测状态,须要工单申请、凋谢后才可应用。
4.1.1 阿里云对象存储OSS筹备
1.在阿里云侧,须要在指标region筹备好须要保留迁徙数据的OSS目录:
- 创立RAM子账号并授予OSS bucket的读写权限和在线迁徙管理权限。
· 登录RAM 控制台。
· 在左侧导航栏,单击人员治理 > 用户 > 创立用户。
· 选中控制台明码登录和编程拜访,之后填写用户账号信息。
· 保留生成的账号、明码、AccessKeyID 和 AccessKeySecret。
· 选中用户登录名称,单击增加权限,授予子账号存储空间读写权限(AliyunOSSFullAccess)和在线迁徙管理权限(AliyunMGWFullAccess)。
· 受权实现后,在左侧导航栏,单击概览 > 用户登录地址链接,应用刚创立的 RAM 子账号的用户名和明码进行登录。
4.1.2 AWS侧筹备可编程拜访S3的IAM账号
· 预估迁徙数据,进入管控台中确认S3中有的存储量与文件数量。
· 创立编程拜访S3的IAM账号
1.进入IAM,抉择创立用户。
2.为新建用户增加读取S3的权限
赋予AmazonS3ReadOnlyAccess权限。
3.记录AK信息,在数据迁徙中会用到。
4.1.3 创立在线迁徙工作
4.2 应用在线迁徙服务迁徙数据
进入OSS web-console页面,进入对象存储的”数据导入”性能菜单:
点击”Data Online Migration”菜单,进入在线数据迁徙工具页面:
公测期间如未开明,须要填写申请表单进行申请,开明后可应用在线迁徙服务。
开明后,按以下步骤创立在线数据迁徙工作。
4.2.1定义源数据地址和指标数据地址
进入数据地址(“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筹备章节中的账号身份)
保留数据源定义:
4.2.2创立迁徙工作
从左侧tab页面中找到迁徙工作,并进入页面,点击创立迁徙工作。
定义迁徙工作的工作信息:
· 源数据地址填写曾经定义的s3数据源;
· 指标地址填写曾经定义的oss数据源;
· 本次抉择全量迁徙的迁徙类型;
点击Next,定义作业传输性能相干参数:
这里须要填写迁徙的数据大小和文件个数。可通过S3的控制台,右键查看目录的属性,获取迁徙目录的数据大小和文件个数并填写到作业参数当中。
实现迁徙工作创立后,可在迁徙工作列表中查看曾经创立好的迁徙作业:
作业提交后会在主动运行,通过查看Jobe Status查看作业状态,Finished代表迁徙工作胜利完结。
点击作业的”Manage”按钮能够查看作业运行状况。
进入到指标OSS的目录,查看数据迁徙的后果。
目录及文件全副已从S3迁徙到OSS。
5 MaxCompute间接加载OSS数据
通过在线迁徙服务,咱们将AWS Redshift的导出的数据从S3迁徙到了阿里云OSS,上面将利用MaxCompute LOAD命令将OSS数据加载到MaxCompute我的项目中。
5.1 创立MaxCompute Table
在DataWorks长期查问界面或MaxCompute命令行工具odpscmd中,应用Redshift集群数据的DDL在MaxCompute中创立对应的内表。
示例如下:
--MaxCompute DDLCREATE 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;
5.2 LOAD命令加载OSS数据到MaxCompute表
5.2.1 创立具备拜访OSS权限的Ram Role
LOAD命令反对STS认证和AccessKey认证两种形式,AccessKey形式须要应用明文AccessKey/ AccessKey Secret,例如:
LOAD overwrite table ordersfrom 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)能够表演应用该角色。
5.2.2 通过LOAD命令加载数据
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我的项目中。
6 数据核完整性与正确性核查
您能够通过表的数量、记录的数量、典型作业的查问后果来校验迁徙到MaxCompute的数据是否和Redshift集群的数据统一。以典型作业举例如下。
6.1 在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_orderfrom lineitemgroup by l_returnflag, l_linestatusorder by l_returnflag,l_linestatus;
查看后果
6.2 在MaxCompute中运行雷同的查问后果
在Dataworks或者MaxCompte命令行执行与Redshift雷同的Query验证数据一致性:
本文为阿里云原创内容,未经容许不得转载。