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目录:

  1. 创立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验证数据一致性:

本文为阿里云原创内容,未经容许不得转载。