雲計算

Amazon Redshift數據遷移阿里雲MaxCompute技術方案

1 方案概述

本文將介紹如何通過公網環境遷移Amazon Redshift數據到阿里雲MaxCompute服務當中。

本方案的總體遷移流程如下:

image.png

第一, 將Amazon Redshift 中的數據導出到Amazon S3存儲上;

第二, 藉助阿里雲在線遷移服務(Data Online Migration)從AWS S3將數據遷移到阿里雲OSS上;

第三, 將數據從阿里雲OSS加載到同Region的MaxCompute項目中,並進行校驗數據完整性。

2 前提條件

· 準備Redshift的集群環境及數據環境;

使用已有的Redshift集群或創建新的Redshift集群:

**image.png
**

在Redshift集群中準備好需要遷移的數據,本方案中在public schema中準備了TPC-H數據集進行方案介紹:

image.png

· 準備MaxCompute的項目環境;

在阿里雲Region創建MaxCompute項目,這裡以新加坡Region為例,創建了作為遷移目標的MaxCompute項目:

image.png

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 '<access-key-id>'
secret_access_key '<secret-access-key>'
session_token '<temporary-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目錄下可以查到文件文件:

image.png

文件樣例如下:

image.png

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格式的文件。

image.png
得益於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為例)創建角色。
image.png

創建角色時,” Choose a use case”選擇Redshift服務,並選擇Redshift-Customizable的”use case”
image.png

3.2.2 添加讀寫S3的權限策略

” Attach permissions policies”時,添加具備寫S3的Policy,本方案選擇使用” AmazonS3FullAccess”。
image.png

3.2.3為IAM Role命名並完成IAM 角色創建

本方案中命名為redshift_s3_role
image.png
打開剛定義的role並複製角色ARN,unload命令將會使用該Role ARN訪問S3.

3.2.4Redshift集群添加IAM Role以獲取訪問S3權限

進入Redshift集群列表,選擇需要遷移的集群,在”Action”列表中選擇”Manage IAM Role”菜單,進行IAM角色的關聯。
image.png

將已經成功創建的具備訪問S3權限的IAM Role角色添加到集群可用IAM roles列表以獲取Redshift對S3讀寫的權限並保存生效:
image.png

查看添加的IAM roles,確認集群已經添加了前文創建的redshift_s3_role角色。
image.png

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命令:
image.png

在S3對應的bucke目錄下檢查導出的數據:
image.png

保存的格式為符合預期的Parquet格式:
image.png

4 遷移AWS S3數據到阿里雲OSS

4.1 在線遷移服務實現S3到OSS遷移

阿里雲在線遷移服務支持遷移其他雲廠商對象存儲數據到阿里雲OSS,其中對於在線遷移服務介紹以及S3到OSS的遷移介紹可以參考阿里雲官方文檔。

目前在線遷移服務處於公測狀態,需要工單申請、開放後才可使用。

4.1.1 阿里雲對象存儲OSS準備

1.在阿里雲側,需要在目標region準備好需要保存遷移數據的OSS目錄:

image.png

  1. 創建RAM子賬號並授予OSS bucket的讀寫權限和在線遷移管理權限。

· 登錄RAM 控制檯。

· 在左側導航欄,單擊人員管理 > 用戶 > 創建用戶。

· 選中控制檯密碼登錄和編程訪問,之後填寫用戶賬號信息。

· 保存生成的賬號、密碼、AccessKeyID 和 AccessKeySecret。

· 選中用戶登錄名稱,單擊添加權限,授予子賬號存儲空間讀寫權限(AliyunOSSFullAccess)和在線遷移管理權限(AliyunMGWFullAccess)。

· 授權完成後,在左側導航欄,單擊概覽 > 用戶登錄地址鏈接,使用剛創建的 RAM 子賬號的用戶名和密碼進行登錄。

4.1.2 AWS側準備可編程訪問S3的IAM賬號

· 預估遷移數據,進入管控臺中確認S3中有的存儲量與文件數量。

· 創建編程訪問S3的IAM賬號

1.進入IAM,選擇創建用戶。
image.png

2.為新建用戶添加讀取S3的權限
image.png

賦予AmazonS3ReadOnlyAccess權限。

3.記錄AK信息,在數據遷移中會用到。
image.png

4.1.3 創建在線遷移任務

4.2 使用在線遷移服務遷移數據

進入OSS web-console頁面,進入對象存儲的”數據導入”功能菜單:
image.png

點擊”Data Online Migration”菜單,進入在線數據遷移工具頁面:
image.png

公測期間如未開通,需要填寫申請表單進行申請,開通後可使用在線遷移服務。

開通後,按以下步驟創建在線數據遷移任務。

4.2.1定義源數據地址和目標數據地址

進入數據地址(“Data Access”)頁面,點擊”創建數據地址(Create Data Access)”按鈕,開始創建源和目標數據源。
image.png

【創建源地址:】
image.png

其中:

· 數據類型選擇: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賬號身份)

保存數據源定義:
image.png

【創建目標地址:】
image.png

其中:

• 數據類型選擇: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準備章節中的賬號身份)

保存數據源定義:
image.png

4.2.2創建遷移任務

從左側tab頁面中找到遷移任務,並進入頁面,點擊創建遷移任務。
image.png

定義遷移任務的任務信息:
image.png

· 源數據地址填寫已經定義的s3數據源;

· 目標地址填寫已經定義的oss數據源;

· 本次選擇全量遷移的遷移類型;

點擊Next,定義作業傳輸性能相關參數:
image.png

這裡需要填寫遷移的數據大小和文件個數。可通過S3的控制檯,右鍵查看目錄的屬性,獲取遷移目錄的數據大小和文件個數並填寫到作業參數當中。
image.png

完成遷移任務創建後,可在遷移任務列表中查看已經創建好的遷移作業:
image.png

作業提交後會在自動運行,通過查看Jobe Status查看作業狀態,Finished代表遷移任務成功結束。
image.png

點擊作業的”Manage”按鈕可以查看作業運行情況。
image.png

進入到目標OSS的目錄,查看數據遷移的結果。

image.png

目錄及文件全部已從S3遷移到OSS。

image.png

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:// <yourAccessKeyId>:<yourAccessKeySecret>@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角色。

image.png

編輯配置該ram角色的信任策略,允許MaxCompute服務(Service:odps.aliyuncs.com)可以扮演使用該角色。

image.png

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。

image.png

導入成功後,可以通過SQL命令查看和校驗數據導入結果:

image.png

通過執行多個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;

查看結果
image.png

6.2 在MaxCompute中運行相同的查詢結果

在Dataworks或者MaxCompte命令行執行與Redshift相同的Query驗證數據一致性:
image.png

Leave a Reply

Your email address will not be published. Required fields are marked *