关于云服务:Amazon-Redshift数据迁移阿里云MaxCompute技术方案

128次阅读

共计 8929 个字符,预计需要花费 23 分钟才能阅读完成。

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 PARQUET

iam_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 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;

5.2 LOAD 命令加载 OSS 数据到 MaxCompute 表

5.2.1 创立具备拜访 OSS 权限的 Ram Role

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) 能够表演应用该角色。

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_order
from lineitem
group by l_returnflag, l_linestatus
order by l_returnflag,l_linestatus;

查看后果

6.2 在 MaxCompute 中运行雷同的查问后果

在 Dataworks 或者 MaxCompte 命令行执行与 Redshift 雷同的 Query 验证数据一致性:

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

正文完
 0