本文將介紹如何經過公網環境遷移Amazon Redshift數據到阿里雲MaxCompute服務當中。html
本方案的整體遷移流程以下:web
第一, 將Amazon Redshift 中的數據導出到Amazon S3存儲上;sql
第二, 藉助阿里雲在線遷移服務(Data Online Migration)從AWS S3將數據遷移到阿里雲OSS上;數據庫
第三, 將數據從阿里雲OSS加載到同Region的MaxCompute項目中,並進行校驗數據完整性。apache
· 準備Redshift的集羣環境及數據環境;編程
使用已有的Redshift集羣或建立新的Redshift集羣:安全
**
**session
在Redshift集羣中準備好須要遷移的數據,本方案中在public schema中準備了TPC-H數據集進行方案介紹:工具
· 準備MaxCompute的項目環境;oop
在阿里雲Region建立MaxCompute項目,這裏以新加坡Region爲例,建立了做爲遷移目標的MaxCompute項目:
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方式進行數據導出。
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目錄下能夠查到文件文件:
文件樣例以下:
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格式做爲數據導出和跨雲遷移的數據格式。
進入https://console.aws.amazon.com/iam/home?region=ap-southeast-1#/roles(以新加坡Region爲例)建立角色。
建立角色時,」 Choose a use case」選擇Redshift服務,並選擇Redshift-Customizable的」use case」
」 Attach permissions policies」時,添加具有寫S3的Policy,本方案選擇使用」 AmazonS3FullAccess」。
本方案中命名爲redshift_s3_role
打開剛定義的role並複製角色ARN,unload命令將會使用該Role ARN訪問S3.
進入Redshift集羣列表,選擇須要遷移的集羣,在」Action」列表中選擇」Manage IAM Role」菜單,進行IAM角色的關聯。
將已經成功建立的具有訪問S3權限的IAM Role角色添加到集羣可用IAM roles列表以獲取Redshift對S3讀寫的權限並保存生效:
查看添加的IAM roles,確認集羣已經添加了前文建立的redshift_s3_role角色。
使用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格式:
阿里雲在線遷移服務支持遷移其餘雲廠商對象存儲數據到阿里雲OSS,其中對於在線遷移服務介紹以及S3到OSS的遷移介紹能夠參考阿里雲官方文檔。
目前在線遷移服務處於公測狀態,須要工單申請、開放後纔可以使用。
1.在阿里雲側,須要在目標region準備好須要保存遷移數據的OSS目錄:
· 登陸RAM 控制檯。
· 在左側導航欄,單擊人員管理 > 用戶 > 建立用戶。
· 選中控制檯密碼登陸和編程訪問,以後填寫用戶帳號信息。
· 保存生成的帳號、密碼、AccessKeyID 和 AccessKeySecret。
· 選中用戶登陸名稱,單擊添加權限,授予子帳號存儲空間讀寫權限(AliyunOSSFullAccess)和在線遷移管理權限(AliyunMGWFullAccess)。
· 受權完成後,在左側導航欄,單擊概覽 > 用戶登陸地址連接,使用剛建立的 RAM 子帳號的用戶名和密碼進行登陸。
· 預估遷移數據,進入管控臺中確認S3中有的存儲量與文件數量。
· 建立編程訪問S3的IAM帳號
1.進入IAM,選擇建立用戶。
2.爲新建用戶添加讀取S3的權限
賦予AmazonS3ReadOnlyAccess權限。
3.記錄AK信息,在數據遷移中會用到。
進入OSS web-console頁面,進入對象存儲的」數據導入」功能菜單:
點擊」Data Online Migration」菜單,進入在線數據遷移工具頁面:
公測期間如未開通,須要填寫申請表單進行申請,開通後可以使用在線遷移服務。
開通後,按如下步驟建立在線數據遷移任務。
進入數據地址(「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準備章節中的帳號身份)
保存數據源定義:
從左側tab頁面中找到遷移任務,並進入頁面,點擊建立遷移任務。
定義遷移任務的任務信息:
· 源數據地址填寫已經定義的s3數據源;
· 目標地址填寫已經定義的oss數據源;
· 本次選擇全量遷移的遷移類型;
點擊Next,定義做業傳輸性能相關參數:
這裏須要填寫遷移的數據大小和文件個數。可經過S3的控制檯,右鍵查看目錄的屬性,獲取遷移目錄的數據大小和文件個數並填寫到做業參數當中。
完成遷移任務建立後,可在遷移任務列表中查看已經建立好的遷移做業:
做業提交後會在自動運行,經過查看Jobe Status查看做業狀態,Finished表明遷移任務成功結束。
點擊做業的」Manage」按鈕能夠查看做業運行狀況。
進入到目標OSS的目錄,查看數據遷移的結果。
目錄及文件所有已從S3遷移到OSS。
經過在線遷移服務,咱們將AWS Redshift的導出的數據從S3遷移到了阿里雲OSS,下面將利用MaxCompute LOAD命令將OSS數據加載到MaxCompute項目中。
在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;
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)能夠扮演使用該角色。
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項目中。
您能夠經過表的數量、記錄的數量、典型做業的查詢結果來校驗遷移到MaxCompute的數據是否和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;
查看結果
在Dataworks或者MaxCompte命令行執行與Redshift相同的Query驗證數據一致性:
本文爲阿里雲原創內容,未經容許不得轉載。