Amazon S3 转移作业简介
借助适用于 Amazon S3 的 BigQuery Data Transfer Service,您可以自动安排和管理从 Amazon S3 到 BigQuery 的周期性加载作业。
支持的文件格式
BigQuery Data Transfer Service 支持从 Amazon S3 加载以下格式的数据:
- 英文逗号分隔值 (CSV)
- JSON(以换行符分隔)
- Avro
- Parquet
- ORC
支持的压缩类型
适用于 Amazon S3 的 BigQuery Data Transfer Service 支持加载压缩数据。BigQuery Data Transfer Service 支持的压缩类型与 BigQuery 加载作业支持的压缩类型相同。如需了解详情,请参阅加载压缩和未压缩的数据。
Amazon S3 前提条件
要从 Amazon S3 数据源加载数据,您必须满足以下前提条件:
- 提供源数据的 Amazon S3 URI
- 拥有访问密钥 ID
- 拥有私有访问密钥
- 至少设置针对 Amazon S3 源数据的 AWS 托管政策
AmazonS3ReadOnlyAccess
Amazon S3 URI
当您提供 Amazon S3 URI 时,路径必须采用以下格式:s3://bucket/folder1/folder2/...
只需要顶层存储桶名称。文件夹名称是可选的。如果指定的 URI 仅包含存储桶名称,则系统会将存储桶中的所有文件转移并加载到 BigQuery 中。
Amazon S3 转移作业运行时参数化
Amazon S3 URI 和目标表都可以参数化处理,以便您能够从按日期组织的 Amazon S3 存储桶加载数据。请注意,无法参数化处理 URI 的存储桶部分。Amazon S3 转移作业使用的参数与 Cloud Storage 转移作业使用的参数相同。
如需了解详情,请参阅转移作业中的运行时参数。
Amazon S3 转移作业的数据注入
在设置 Amazon S3 转移作业时,您可以在转移作业配置中选择写入偏好设置来指定数据加载到 BigQuery 的方式。
有两种类型的写入偏好设置:增量转移和截断的转移。增量转移
具有 APPEND
或 WRITE_APPEND
写入偏好设置的转移作业配置(也称为增量转移),将从上次成功转移到 BigQuery 目标表后,以增量方式附加新数据。如果转移作业配置使用 APPEND
写入偏好设置运行,BigQuery Data Transfer Service 会过滤自上次转移作业成功运行以来修改的文件。为了确定文件的修改时间,BigQuery Data Transfer Service 会查看文件元数据中的“上次修改时间”属性。例如,BigQuery Data Transfer Service 会查看 Cloud Storage 文件中的 updated
时间戳属性。如果 BigQuery Data Transfer Service 发现任何文件的“上次修改时间”出现在上次成功转移的时间戳之后,则 BigQuery Data Transfer Service 会以增量转移方式转移这些文件。
为了演示增量转移的工作原理,请考虑以下 Cloud Storage 转移示例。用户于 2023-07-01T00:00Z 在 Cloud Storage 存储桶中创建了一个名为 file_1
的文件。file_1
的 updated
时间戳是文件的创建时间。然后,用户从 Cloud Storage 存储桶创建增量转移,安排成从 2023-07-01T03:00Z 起每天 03:00Z 运行一次。
- 在 2023-07-01T03:00Z,首次转移作业开始运行。由于这是此配置的首次转移作业运行,因此 BigQuery Data Transfer Service 会尝试将与源 URI 匹配的所有文件加载到目标 BigQuery 表中。转移作业运行成功,且 BigQuery Data Transfer Service 成功将
file_1
加载到目标 BigQuery 表中。 - 下一次转移作业运行 (2023-07-02T03:00Z) 检测不到
updated
时间戳属性晚于上次转移作业成功运行 (2023-07-01T03:00Z) 的文件。转移作业运行成功,但不会将任何其他数据加载到目标 BigQuery 表中。
上面的示例展示了 BigQuery Data Transfer Service 如何查看源文件的 updated
时间戳属性,以确定是否对源文件进行了任何更改,并在检测到任何更改时转移这些更改。
按照相同的示例,假设用户于 2023-07-03T00:00Z 在 Cloud Storage 存储桶中创建了另一个名为 file_2
的文件。file_2
的 updated
时间戳是文件的创建时间。
- 下一次转移作业运行(时间 2023-07-03T03:00Z)检测到
file_2
的updated
时间戳晚于上一次转移作业成功运行 (2023-07-01T03:00Z)。假设转移作业运行因暂时性错误而失败。在这种情况下,file_2
不会加载到目标 BigQuery 表中。上一次成功的转移作业运行时间戳仍为 2023-07-01T03:00Z。 - 下一次转移作业运行(时间 2023-07-04T03:00Z)检测到
file_2
的updated
时间戳晚于上次转移作业成功运行 (2023-07-01T03:00Z)。这次,转移作业运行成功完成且没有出现问题,因此成功将file_2
加载到目标 BigQuery 表中。 - 下一次转移作业运行(时间 2023-07-05T03:00Z)检测不到
updated
时间戳晚于上一次转移作业成功运行 (2023-07-04T03:00Z) 的文件。转移作业运行成功,但不会将任何其他数据加载到目标 BigQuery 表中。
上面的示例显示,转移作业失败时,没有任何文件转移到 BigQuery 目标表。任何文件更改都将在下一次转移作业成功运行时转移。转移作业失败后的任何后续成功转移作业都不会导致重复数据。如果转移作业失败,您还可以选择在计划安排的时间之外手动触发转移作业。
截断的转移
具有 MIRROR
或 WRITE_TRUNCATE
写入偏好设置的转移作业配置(也称为截断的转移)会在每次转移作业运行期间,使用与源 URI 匹配的所有文件中的数据来覆盖 BigQuery 目标表中的数据。MIRROR
用于覆盖目标表中数据的新副本。如果目标表使用分区修饰器,则转移作业运行只会覆盖指定分区中的数据。具有分区修饰器的目标表的格式为 my_table${run_date}
,例如 my_table$20230809
。
一天内重复相同的增量转移或截断的转移不会导致重复数据。但是,如果您运行多个会影响同一 BigQuery 目标表的转移作业配置,则可能会导致 BigQuery Data Transfer Service 重复转移数据。
Amazon S3 URI 的通配符支持
如果源数据分布在共用一个基本名称的多个文件中,则加载数据时可以在 URI 中使用通配符。通配符由星号 (*) 组成,可用于 Amazon S3 URI 中的任何位置(存储桶名称除外)。
虽然可以在 Amazon S3 URI 中使用多个通配符,但当 Amazon S3 URI 仅指定单个通配符时,您可以进行一些优化:
每次转移运行的最大文件数存在较高的限制。
通配符可跨目录边界起效。例如,Amazon S3 URI
s3://my-bucket/*.csv
将与s3://my-bucket/my-folder/my-subfolder/my-file.csv
文件匹配。
Amazon S3 URI 示例
示例 1
如需将 Amazon S3 中的单个文件加载到 BigQuery 中,请指定该文件的 Amazon S3 URI。
s3://my-bucket/my-folder/my-file.csv
示例 2
如需将 Amazon S3 存储桶中的所有文件加载到 BigQuery 中,请仅指定存储桶名称(可以包含通配符,也可以不包含通配符)。
s3://my-bucket/
或
s3://my-bucket/*
请注意,s3://my-bucket*
不是有效的 Amazon S3 URI,因为存储桶名称中不允许使用通配符。
示例 3
如需从 Amazon S3 加载具有共用前缀的所有文件,请指定该共用前缀,然后在后面加上通配符。
s3://my-bucket/my-folder/*
请注意,不同于加载顶级 Amazon S3 存储桶中的所有文件,要加载任何文件必须在其 Amazon S3 URI 末尾指定通配符。
示例 4
如需加载 Amazon S3 中具有相似路径的所有文件,请指定共用前缀,然后在后面加上通配符。
s3://my-bucket/my-folder/*.csv
示例 5
请注意,通配符可跨目录起效,因此 my-folder
中以及 my-folder
的子文件夹中的任何 csv
文件都将加载到 BigQuery 中。
如果 logs
文件夹下有以下源文件:
s3://my-bucket/logs/logs.csv
s3://my-bucket/logs/system/logs.csv
s3://my-bucket/logs/some-application/system_logs.log
s3://my-bucket/logs/logs_2019_12_12.csv
则以下表达式可标识这些文件:
s3://my-bucket/logs/*
示例 6
如果您有以下源文件,但只想转移文件名为 logs.csv
的源文件:
s3://my-bucket/logs.csv
s3://my-bucket/metadata.csv
s3://my-bucket/system/logs.csv
s3://my-bucket/system/users.csv
s3://my-bucket/some-application/logs.csv
s3://my-bucket/some-application/output.csv
则以下表达式可标识名称中包含 logs.csv
的文件:
s3://my-bucket/*logs.csv
示例 7
通过使用多个通配符,您可以对需要转移的文件进行更多控制,但是会降低限制。使用多个通配符意味着每个通配符最多只会匹配到一个子目录内的一个路径的末尾。例如,对于 Amazon S3 中的以下源文件:
s3://my-bucket/my-folder1/my-file1.csv
s3://my-bucket/my-other-folder2/my-file2.csv
s3://my-bucket/my-folder1/my-subfolder/my-file3.csv
s3://my-bucket/my-other-folder2/my-subfolder/my-file4.csv
如果您只想转移 my-file1.csv
和 my-file2.csv
,请使用以下表达式作为 Amazon S3 URI 的值:
s3://my-bucket/*/*.csv
由于这两个通配符都不会跨目录起效,因此该 URI 会将需要转移的文件限定为 my-folder1
和 my-other-folder2
中的 CSV 文件。子文件夹不会包含在转移作业之内。
AWS 访问密钥
访问密钥 ID 和私有访问密钥用于代表您访问 Amazon S3 数据。最佳做法是专门为 Amazon S3 转移作业创建唯一的访问密钥 ID 和私有访问密钥,以便提供访问 BigQuery Data Transfer Service 所需的最低访问权限。如需了解如何管理访问密钥,请参阅 AWS 一般参考文档。
一致性考虑因素
从 Amazon S3 转移数据时,有些数据可能无法转移到 BigQuery,尤其是文件刚刚才添加到存储桶的情况下。文件添加到存储桶后,可能需要大约 10 分钟才能在 BigQuery Data Transfer Service 中可用。但是在某些情况下,所需时间可能超过 10 分钟。
如需详细了解 Amazon S3 一致性模型,请参阅 Amazon S3 文档中的 Amazon S3 数据一致性模型。
出站数据转移费用的最佳实践
如果未正确配置目标表,则从 Amazon S3 转移数据可能会失败。可能导致配置不当的原因包括:
- 目标表不存在。
- 表架构未定义。
- 表架构与正在转移的数据不兼容。
为避免产生 Amazon S3 出站数据转移费用,您应先使用较小但有代表性的文件子集来测试转移作业。这里所说的“较小”是指,测试应选择较小的数据大小和较少的文件数量。
价格
如需了解 BigQuery Data Transfer Service 价格,请参阅价格页面。
请注意,使用此服务可能会产生 Google 产品之外费用。如需了解详情,请查看 Amazon S3 价格页面。
配额和限制
BigQuery Data Transfer Service 使用加载作业将 Amazon S3 数据加载到 BigQuery 中。加载作业的所有 BigQuery 配额和限制均适用于周期性 Amazon S3 转移作业,同时还需额外注意以下限制:
值 | 限制 |
---|---|
每次加载作业转移运行的大小上限 | 15 TB |
当 Amazon S3 URI 包含 0 或 1 个通配符时,每次转移运行的最大文件数 | 1000 万个文件 |
当 Amazon S3 URI 包含多个通配符时,每次转移运行的最大文件数 | 1 万个文件 |
后续步骤
- 了解如何设置 Amazon S3 转移作业。
- 了解 S3 转移作业中的运行时参数。
- 详细了解 BigQuery Data Transfer Service。