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

1 方案概述

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

本方案的整體遷移流程以下:web

image.png

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

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

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

2 前提條件

· 準備Redshift的集羣環境及數據環境;編程

使用已有的Redshift集羣或建立新的Redshift集羣:安全

**image.png
**session

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

image.png

· 準備MaxCompute的項目環境;oop

在阿里雲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 ''
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目錄下能夠查到文件文件:

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:// :@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

本文爲阿里雲原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索