使用AWS Glue自定义连接器将数据从BigQuery迁移到S3
1. 从 Google Cloud 下载服务帐号凭据 JSON 文件
1.1. 点击IAM和管理->服务账号,进入服务账号管理页面

1.2. 选择账号,进入密钥管理

1.3. 创建新密钥,选择json类型,点击创建后,会自动下载json格式的密钥文件到本机。


1.4. 对密钥文件进行base64编码
若为windows机器,请使用在线工具进行编码

若为Linux 和 Mac,您可以使用将文件内容打印为 base64 编码的字符串。
执行base64 service_account_json_file.json,将打印出来的内容复制到文本中,注意删除换行符。

2. 获取GoogleCloud的项目ID
点击项目名称,获取对应项目ID,保存以备用。

3. 使用AWS Secrets Manager管理密钥bigquery_credentials_poc
使用Secrets Manager 控制台,创建密钥,选择其它类型密钥,键输入:credentials,值输入使用base64编码后的字符串

输入密钥名称:bigquery_credentials_poc,其它选项默认填写,点击存储生成密钥。

在密钥列表,点击bigquery_credentials_poc,打开详情信息,复制密钥ARN以备用。
arn:aws:secretsmanager:us-west-2:260527533511:secret:bigquery_credentials_poc-wCHyT3
4. 创建S3桶s3-redshift-glue
4.1. 选择AWS区域(东京)创建S3桶s3-redshift-glue,不开放公有访问权限。

复制的s3-redshift-glue的arn以备用。arn:aws:s3:::s3-redshift-glue
4.2. 在S3桶s3-redshift-glue中创建存放数据的文件夹
文件夹名称可根据要导出的表名进行创建。此次创建文件夹311_service_requests。

5. 创建策略policy_secrets_s3
使用以下json创建策略policy_secrets_s3,允许访问密钥bigquery_credentials_poc,S3桶s3-redshift-glue。
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Sid”: “GetDescribeSecret”,
“Effect”: “Allow”,
“Action”: [
“secretsmanager:GetResourcePolicy”,
“secretsmanager:GetSecretValue”,
“secretsmanager:DescribeSecret”,
“secretsmanager:ListSecretVersionIds”
],
“Resource”: “arn:aws:secretsmanager:us-west-2:260527533511:secret:bigquery_credentials_poc-wCHyT3”
},
{
“Sid”: “S3Policy”,
“Effect”: “Allow”,
“Action”: [
“s3:GetBucketLocation”,
“s3:ListBucket”,
“s3:GetBucketAcl”,
“s3:GetObject”,
“s3:PutObject”,
“s3:DeleteObject”
],
“Resource”: [
“arn:aws:s3:::s3-redshift-glue”,
“arn:aws:s3:::s3-redshift-glue/*”
]
}
]
}

6. 创建IAM角色roleGlueBigqueryS3
创建角色roleGlueBigqueryS3,受信任实体类型选择Glue,添加以下三个策略:
- AmazonEC2ContainerRegistryReadOnly
- AWSGlueServiceRole
- policy_s3_secrets

7. 使用AWS Marketplace订阅 AWS Glue Connector for Google BigQuery
7.1. 点击了解产品,搜索 AWS Glue Connector for Google BigQuery

7.2. 选择继续订阅

7.3. 查看条款和条件、定价和其他详细信息

7.4. 选择继续配置

7.5. 对于Fulfillment option,选择您的交付方式;对于Software version,选择您的软件版本,然后选择继续启动

7.6. 在使用说明下,选择在 AWS Glue Studio 中激活 Glue 连接器

7.7. 创建glue connectors:bigquery
输入连接的名称bigquery,密钥文件选择bigquery_credentials_poc

8. 在 AWS Glue Studio 中创建 ETL 作业
8.1. 创建job
- 在 Glue Studio 上,选择Jobs。
- 对于源,选择AWS Glue Connector for Google BigQuery。
- 对于目标,选择S3。
- 点击创建。

8.2. 删除ApplyMapping
选中ApplyMapping并删除它。

8.3. 配置AWS Glue Connector…
8.3.1. 连接选择bigguery。

8.3.2. 在连接选项中添加以下键值
- 键: parentProject,值: <<google_project_id>> #第步骤2中获取的项目ID
- 键: table,值:bigquery-public-data.austin_311.311_service_requests #bigquery中表名
8.4. 配置S3
8.4.1. 选中S3 bucket,选择导出到S3的数据格式,此次POC验证选择JSON

8.4.2. 选择压缩类型

8.4.3. 指定 S3 目标位置

8.5. 配置Job_details
- 输入Name:Glue_BigQuery_S3
- 选择IAM Role:roleGlueBigqueryS3 #为步骤6中创建的角色
- 选择类型:Spark
- 选择Glue version:Glue 2.0 – Supports Spark 2.4, Scala 2, Python3
- 其余选项保留为默认值,点击Save保存

9. 运行ETL作业Job
9.1. 点击详情中右上角Run,运行作业

9.2. 点击Runs,查看执行情况

9.3. 执行成功后查看S3桶中文件

9.4. 下载文件,查看文件格式

10. 总结
至此,使用glue自定义规则从BigQuery同步数据到S3桶已完成,若需要将数据加载到redshift,请在redshift中创建对应表,再使用copy命令导入S3数据到表中。详细操作请见上一份POC文档《Redshift测试工作截图》。
