使用AWS Glue自定义连接器将数据从BigQuery迁移到S3

2022-12-14

1. 从 Google Cloud 下载服务账号凭据 JSON 文件

1.1. 点击 IAM和管理 → 服务账号,进入服务账号管理页面

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

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

1.4. 对密钥文件进行 base64 编码

若为 Windows 机器,请使用在线工具进行编码。

若为 Linux 和 Mac,执行 base64 service_account_json_file.json,将打印出来的内容复制到文本中,注意删除换行符。

2. 获取 Google Cloud 的项目 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 桶 ARN 以备用:arn:aws:s3:::s3-redshift-glue

4.2. 在 S3 桶中创建存放数据的文件夹

文件夹名称可根据要导出的表名创建,此次创建文件夹 311_service_requests

5. 创建策略 policy_secrets_s3

使用以下 JSON 创建策略,允许访问密钥 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. 选择交付方式和软件版本,然后选择继续启动

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

7.7. 创建 Glue 连接器: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. 连接选择 bigquery
8.3.2. 在连接选项中添加以下键值
  • 键:parentProject,值:步骤 2 中获取的项目 ID
  • 键:table,值:bigquery-public-data.austin_311.311_service_requests

8.4. 配置 S3

8.4.1. 选择导出到 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, Python 3
  • 其余选项保留默认值,点击 Save 保存

9. 运行 ETL 作业

9.1. 点击详情右上角 Run,运行作业

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

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

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

10. 总结

至此,使用 Glue 自定义连接器从 BigQuery 同步数据到 S3 桶已完成。若需要将数据加载到 Redshift,请在 Redshift 中创建对应表,再使用 COPY 命令导入 S3 数据到表中。

返回技术博客