从 AWS Redshift 迁移到 ProtonBase 指南

前提条件

  • 需要有权限访问AWS的Redshift及S3环境。

  • 对于目标端,需要有目标端云服务的对象存储的权限(如阿里云的OSS,AWS的S3等)这里以阿里云OSS为例。这里以同AWS区域为例,从宁夏(中国)的Redshift迁移到宁夏(中国)的ProtonBase。

背景信息

将Amazon Redshift数据迁移至ProtonBase的流程如下。

  1. 将Amazon Redshift数据导出至Amazon S3数据湖(简称S3)。
  2. 将数据从S3迁移至同区域的ProtonBase项目中,并校验数据完整性和正确性。

说明

由于Amazon Redshift和ProtonBase之间语法存在很多差异,因此在实际迁移过程中,您需要修改Amazon Redshift上编写的脚本,然后才能在ProtonBase中使用。由于ProtonBase兼容Postgresql 的语法,可以参考Amazon Redshift和Postgresql间的语法差异信息,请参见Amazon Redshift 和 PostgreSQL - Amazon Redshift (opens in a new tab)

步骤一:将Amazon Redshift数据导出至S3

Amazon Redshift支持IAM角色和临时安全凭证(AccessKey)认证方式。您可以基于这两种认证方式通过Redshift UNLOAD命令将数据导出至S3。将Amazon Redshift数据导出至S3的详细操作内容请参见卸载数据 (opens in a new tab)

两种认证方式的UNLOAD命令格式如下:

  • 基于IAM角色的UNLOAD命令
-- 通过UNLOAD命令将表customer的内容导出至S3。
UNLOAD ('SELECT * FROM customer')
TO 's3://bucket_name/unload_from_redshift/customer/customer_' --S3 Bucket。
IAM_ROLE 'arn:aws-cn:iam::****:role/MyRedshiftRole'; --角色ARN。
  • 基于AccessKey的UNLOAD命令
-- 通过UNLOAD命令将表customer的内容导出至S3。
UNLOAD ('SELECT * FROM customer')
TO 's3://bucket_name/unload_from_redshift/customer/customer_' --S3 Bucket。
Access_Key_id '<access-key-id>'  --IAM用户的Access Key ID。
Secret_Access_Key '<secret-access-key>'  --IAM用户的Access Key Secret。
Session_Token '<temporary-token>';  --IAM用户的临时访问令牌。

UNLOAD命令导出的数据格式如下:

  • 以PARQUET格式导出,便于其它引擎直接读取数据。命令示例如下。
UNLOAD ('SELECT * FROM customer')
TO 's3://bucket_name/unload_from_redshift/customer_parquet/customer_'
FORMAT AS PARQUET
IAM_ROLE 'arn:aws-cn:iam::xxxx:role/redshift_s3_role';
  • 执行成功后,您可以在对应Bucket中查看导出的文件。PARQUET文件数据压缩率更高,查询速度更快。

本文以IAM角色认证及导出PARQUET格式为例介绍数据迁移操作。

  1. 新建Redshift类型的IAM角色。

    1. 登录IAM控制台 (opens in a new tab),单击创建角色

    2. 创建角色页面的选择“亚马逊云科技 服务”,使用案例选择“Redshift”。在选择您的使用案例区域单击Redshift后,单击下一步

  1. 添加读写S3的权限策略。在创建角色页面的Attach权限策略区域,输入S3,选中AmazonS3FullAccess,单击下一步

  2. 为IAM角色命名并完成IAM角色创建。

    1. 单击下一步:审核,在创建角色页面的审核区域,配置角色名称角色描述,单击创建角色,完成IAM角色创建。

    1. 返回IAM控制台 (opens in a new tab),在搜索框输入redshift_s3_role,单击redshift_s3_role角色名称,获取并记录角色ARN

    2. 执行UNLOAD命令迁移数据时会使用角色ARN访问S3。

  3. 为Redshift集群添加创建好的IAM角色,获取访问S3的权限。

    1. 登录Amazon Redshift控制台 (opens in a new tab),在右上角选择区域为中国 (宁夏)

    2. 在左侧导航栏,单击集群,选中已创建好的Redshift集群,在操作下拉列表选择管理 IAM 角色

    3. 管理 IAM 角色页面,单击搜索框右侧的

    4. 图标,选择redshift_s3_role。单击添加 IAM 角色 > 完成,将具备S3访问权限的redshift_s3_role添加至Redshift集群。

  4. 将Amazon Redshift数据导出至S3。

    1. 返回Amazon Redshift控制台 (opens in a new tab)

    2. 在左侧导航栏,单击编辑器,执行UNLOAD命令将Amazon Redshift数据以PARQUET格式导出至S3的Bucket目录。

    3. 命令示例如下。

UNLOAD ('SELECT * FROM tickit.category')
TO 's3://bucket_name/unload_from_redshift/customer_parquet/category_'
FORMAT AS PARQUET
IAM_ROLE 'arn:aws-cn:iam::xxxx:role/redshift_s3_role';
UNLOAD ('SELECT * FROM tickit.date')
TO 's3://bucket_name/unload_from_redshift/orders_parquet/date_'
FORMAT AS PARQUET
IAM_ROLE 'arn:aws-cn:iam::xxxx:role/redshift_s3_role';
  1. 登录S3控制台 (opens in a new tab),在S3的Bucket目录下检查导出的数据。

    格式为符合预期的PARQUET格式。

步骤二:将数据从S3迁移至同区域的 Protonbase

您可以通过 ProtonBase 的create foreign table命令创建数据存放在对象存储的外表,然后使用insert的方式将对象存储的数据迁移至同区域的 ProtonBase 中。

具体操作如下

-- 创建扩展插件
CREATE EXTENSION file_fdw;
 
-- 配置数据封装服务器
CREATE SERVER s3_server FOREIGN DATA WRAPPER file_fdw OPTIONS (REGION 'cn-northwest-1');
 
-- 创建外表的用户匹配
CREATE USER MAPPING FOR public SERVER s3_server
OPTIONS (
 ACCESS_ID '*****',
 ACCESS_KEY '****'
);
 
-- 创建外表,指定s3位置
CREATE FOREIGN TABLE public.category
 (catid smallint, catgroup text, catname text , catdesc text)
 SERVER s3_server
 OPTIONS (dir 's3://s3bucket/robert/category/', format 'parquet')
 
 
CREATE FOREIGN TABLE public.date
(dateid int,caldate date,day text ,week int,month text,qtr text ,year int,holiday boolean)
 SERVER s3_server
 OPTIONS (dir 's3://s3bucket/robert/date/', format 'parquet')

执行如下命令查看和校验数据导入结果。

SELECT * FROM public.category limit 100;

返回结果示例如下。

在redshift中进行查询。两边的数据是可以对应上。