将 Cloud Storage 用于大数据

在 Google Cloud Platform 上存储和使用大数据时,Cloud Storage 发挥着关键作用。例如:

  • 将数据加载到 BigQuery 中。

  • 使用会自动安装兼容 HDFS 的 Cloud Storage 连接器的 Cloud Dataproc,可并行使用 Cloud Storage 存储分区和 HDFS。

  • 使用存储分区来存储 Cloud Dataflow 流水线的暂存文件和临时数据。

Cloud Dataflow 需要 Cloud Storage 存储分区才能运行。对于 BigQuery 和 Cloud Dataproc,您可以自行选择是否使用 Cloud Storage 存储分区(建议使用)。

gsutil 是一个命令行工具,让您可以轻松可靠地使用 Cloud Storage 存储分区和对象,特别是在大数据场景中。例如,借助 gsutil,您可以使用单个命令并行复制多个文件、高效复制大文件、计算数据的校验和,以及测量从本地计算机到 Cloud Storage 的性能。

本页面重点介绍了如何将 gsutil 用于大数据任务。如需查看更加简明的 gsutil 介绍,请参阅使用入门:使用 gsutil 工具。您可以在线访问所有 gsutil 命令的详细文档,也可以通过运行 gsutil help,在内置帮助内容中查看这些文档。

为了充分利用本页面介绍的示例,您需要以下组件:

将多个文件复制到存储分区中

如果您要上传大量文件,您可以使用 gsutil -m 选项执行并行(多线程/多处理)复制。如需递归复制子目录,请使用 cp 命令的 -R 标志。例如,如需将文件(包括子目录)从名为 top-level-dir 的本地目录复制到存储分区中,您可以使用以下命令:

gsutil -m cp -R top-level-dir gs://example-bucket

您可以使用通配符来为操作匹配一组特定名称。例如,如需仅复制以 image 开头的文件,请运行以下命令:

gsutil -m cp -R top-level-dir/subdir/image* gs://example-bucket

您可以使用相同的通配符移除文件:

gsutil -m rm gs://example-bucket/top-level-dir/subdir/image*

除了将本地文件复制到云中(反之亦然),您还可以在云中执行复制操作,例如,您可以运行以下命令:

gsutil -m cp gs://example-bucket/top-level-dir/subdir/** gs://example-bucket/top-level-dir/subdir/subdir2

gsutil 会自动检测到您正在移动多个文件,并在名为 subdir2 的新目录中创建这些文件。

同步本地目录

如果要将本地目录与存储分区同步或者将存储分区与本地目录同步,可以使用 gsutil rsync 命令执行相应操作。例如,如需使 gs://example-bucket 匹配本地目录 local-dir 的内容,您可以使用以下命令:

gsutil -m rsync -r local-dir gs://example-bucket

如果您使用 rsync -d 标志,它会指示 gsutil 在目标位置(上述命令中的 gs://example-bucket)删除来源位置 (local-dir) 不存在的文件。您还可以在两个存储分区之间进行同步。

将大文件复制到存储分区中

通常,在处理大数据时,当您的数据进入云中之后,它会保留在云中。在您的数据进入 Google 的云平台之后,您可以非常迅速地将该数据传输到其他服务(比如 Compute Engine)。此外,将流量从存储分区传输到位于同一位置或子位置的 Google Cloud 服务时,您无需支付任何费用。如需了解详情,请参阅网络价格

如需将大型本地文件复制到存储分区中,请使用以下命令:

gsutil cp local-file gs://example-bucket

如需从现有存储分区复制大文件(例如,Cloud Storage 公开数据),请使用以下命令:

gsutil cp gs://example-source-bucket/file  gs://example-destination-bucket

gsutil 充分利用了 Google Cloud Storage 可恢复的上传和下载功能。对于大型文件,这一点尤为重要,因为随着传输数据的大小增加,ISP 出现网络故障的可能性也会增加。gsutil 可以根据服务器实际接收的字节数来恢复上传操作,因此无需重新发送字节,并且可以确保最终完成上传。下载操作应用了相同的逻辑(基于本地文件的大小)。

上传大型文件时,如果 gsutil cp 无法为您提供所需的性能,您可以考虑配置复合上传

配置存储分区

在以下大数据任务中,您通常需要配置存储分区:将数据移动到其他存储类别、配置日志访问权限、配置对象版本控制或者设置生命周期规则

您可以使用 gsutil ls -L -b 列出存储分区的配置详细信息:

gsutil ls -L -b gs://example-bucket

在输出中,请注意存储分区配置信息,其中大部分也可通过 gsutil 配置:

  • CORS:控制存储分区的跨源资源共享设置。
  • 日志记录:允许您记录存储分区的使用情况。
  • 网站:允许存储分区中的对象充当网页或用作网站中的静态资产。
  • 版本控制:可删除存储分区中的对象以创建归档版本。
  • 存储类别:允许您在存储分区的创建过程中设置存储类别。
  • 生命周期:允许在存储分区上运行定期操作 - 最常见的操作是过时对象删除。

例如,假设您只想在特定存储分区中将文件保留一天,那么,您可以使用以下命令设置存储分区的生命周期规则:

echo '{ "rule": [{ "action": {"type": "Delete"}, "condition": {"age": 1}}]}' > lifecycle_config.json
gsutil lifecycle set lifecycle_config.json gs://example-bucket

现在,您的存储分区中保留超过一天的所有对象都将被系统从存储分区中自动删除。您可以使用 gsutil lifecycle 命令验证刚刚设置的配置(其他配置命令的运行方式与此类似):

gsutil lifecycle get gs://example-bucket

共享存储分区中的数据

处理大数据时,您可能会协同处理文件,并且您需要能够为特定的人员或群组提供访问权限。每个对象都具有一个 ACL(指定了可以访问该对象的人员)。您可以使用 gsutil acl 命令直观查看对象的 ACL:

gsutil acl get gs://example-bucket/file

上传该对象的实体(在本例中,该实体指的是您的 Google 帐号,该帐号由 OAuth2 刷新令牌表示)会自动获得该对象的“所有者”访问权限(请参阅项目成员和权限)。

对象的 ACL 中的其余内容由存储分区上的默认对象 ACL 确定。这一点常常造成混淆 - 存储分区 ACL 控制存储分区的访问权限(例如,是否能够创建和列出对象),而默认对象 ACL 控制的是对象在创建时获得的 ACL;两者不一定相同!如需详细了解两者之间的差异,请参阅访问控制

您可以配置存储分区,使得拥有 Google 帐号的任何人员都可以列出存储分区中的文件。请注意,这并不会向他们授予该数据的访问权限。因此,虽然用户可以看到您的存储分区中存在 bigfile,但他们无法看到其中的内容。

gsutil acl ch -g 'AllAuthenticatedUsers:R' gs://example-bucket

您可以使用 ls -Lb 命令查看存储分区的 ACL:

gsutil ls -Lb gs://example-bucket

现在,使用 Google 帐号完成了身份验证的任何人员都可以列出存储分区中的文件。

以下三节介绍了三种常见情景,即公开共享数据、与群组共享数据以及与他人共享数据。

公开共享

对于全世界都可以读取的存储分区,您可以做出以下配置:

# Read access on the bucket so that is contents can be listed
gsutil acl ch -g AllUsers:R gs://example-bucket

# Default bucket ACL so any new objects added at a later date are readable.
gsutil defacl ch -g AllUsers:R gs://example-bucket

# Read access to all of its current contents.
gsutil -m acl ch -R -g AllUsers:R gs://example-bucket

与群组共享

对于不是 Google Cloud Platform 项目成员的协作者,我们建议您创建 Google 群组,然后将 Google 群组添加到存储分区中。例如,对于 gs-announce Google 群组,您可以做出以下配置:

# Read access to the bucket so that its contents can be listed.
gsutil acl ch -g 'gs-announce@googlegroups.com:R' gs://example-bucket

# Default bucket ACL so any new objects added at a later date are readable.
gsutil defacl ch -g 'gs-announce@googlegroups.com:R' gs://example-bucket

# Read access to all of a bucket's current contents.
gsutil -m acl ch -R -g 'gs-announce@googlegroups.com:R' gs://example-bucket

如需了解详情,请参阅使用群组控制对象的访问权限

与他人共享

如果存在许多协作者,请使用群组。如果只存在一位协作者,您可以按如下所示配置访问权限:

# Read access to the bucket so that its contents can be listed.
gsutil acl ch -u liz@gmail.com:R gs://example-bucket

# Default bucket ACL so any new objects added at a later date are readable.
gsutil defacl ch -u liz@gmail.com:R gs://example-bucket

# Read access to all of a bucket's current contents.
gsutil -m acl ch -R -u liz@gmail.com:R gs://example-bucket

显示存储分区中的数据量

您可以使用 gsutil du 命令显示所有对象在指定存储分区中占用的总空间。例如:

gsutil du -sh gs://example-bucket

请参阅 gsutil du 命令帮助,了解您可以使用的更多选项(包括如何返回某个前缀下的所有对象的大小)。

您还可以设置存储分区日志记录(每天自动报告一次存储分区的总大小)。如需了解详情,请参阅访问日志。如果存储分区中的对象数量较大(例如,数十万或数百万),则您可以通过此方法来更有效地跟踪存储空间使用情况。gsutil du 命令通过发出存储分区列举请求来计算存储空间使用情况,对于大型存储分区而言,此操作可能需要很长时间。

您可以使用以下命令计算存储分区中的文件数量:

gsutil ls gs://example-bucket/** | wc -l

清理存储分区

您可以使用以下命令快速清理存储分区:

gsutil -m rm gs://example-bucket/**

处理校验和

执行复制时,gsutil cpgsutil rsync 命令会验证源文件的校验和是否与目标文件的校验和匹配。在极少数情况下,校验和不匹配,此时,gsutil 会删除无效复制并输出一则警告消息。如需了解详情,请参阅校验和验证

您还可以使用 gsutil 获取存储分区中的文件的校验和,或计算本地对象的校验和。例如,假设您使用以下命令将 Cloud Life Sciences 公开数据文件复制到工作存储分区:

gsutil -m cp gs://genomics-public-data/1000-genomes/vcf/ALL.chrMT.phase1_samtools_si.20101123.snps.low_coverage.genotypes.vcf gs://example-bucket

现在,您可以获取两个版本(该文件在公开存储分区中的版本,以及该文件在您的存储分区中的版本)的校验和,以确保它们匹配:

gsutil ls -L gs://example-bucket/ALL.chrMT.phase1_samtools_si.20101123.snps.low_coverage.genotypes.vcf
gsutil ls -L gs://genomics-public-data/1000-genomes/vcf/ALL.chrMT.phase1_samtools_si.20101123.snps.low_coverage.genotypes.vcf

现在,假设您的数据位于本地数据中心的文件中,并且您将该文件复制到了 Cloud Storage 中。您可以使用 gsutil hash 获取本地文件的校验和,然后将该校验和与您复制到存储分区中的文件的校验和进行比较。如需获取本地文件的校验和,请使用以下命令:

gsutil hash local-file

MD5 值

对于非复合对象,对存储分区中的对象运行 gsutil ls -L 将返回如下输出:

gs://example-bucket/100MBfile.txt:
        Creation time:          Thu, 26 Mar 2015 20:11:51 GMT
        Content-Length:         102400000
        Content-Type:           text/plain
        Hash (crc32c):          FTiauw==
        Hash (md5):             daHmCObxxQdY9P7lp9jj0A==
        ETag:                   CPjo7ILqxsQCEAE=
        Generation:             1427400711419000
        Metageneration:         1
        ACL:            [
        ....

对本地文件运行 gsutil hash 将返回如下输出:

Hashing     100MBfile.txt:
Hashes [base64] for 100MBfile.txt:
        Hash (crc32c):          FTiauw==
        Hash (md5):             daHmCObxxQdY9P7lp9jj0A==

两个输出都具有 CRC32c 和 MD5 值。以复合对象形式上传的对象没有 MD5 值(当您为 gsutil 配置复合上传时,就会出现这种情况)。

配置并行复合上传

为了改善上传大文件时的性能,您可以将 gsutil 配置为先拆分每个文件,接着分别上传拆分出来的各个部分,然后使用 Cloud Storage 的复合对象功能将各个部分重新组合为一个复合对象。如需了解详情,请参阅并行复合上传。默认情况下,系统将停用并行复合上传功能。

在配置并行复合上传之前,您应了解该功能的优点和缺点。主要优点是,如果网络和磁盘速度不会给您造成限制,则此功能可以大大加快大文件的上传速度。并行复合上传的缺点如下:

  • 当您(或您的协作者)使用 gsutil 下载复合上传对象(比如使用 gsutil 并行复合上传功能创建的对象)时,我们强烈建议您安装已编译的 crcmod(如 gsutil help crcmod 中所述)。如果不这样做,您将看到一则消息,该消息会警告您:如果您没有已编译的 crcmod,下载复合对象的过程将运行得非常缓慢。请注意,无论是否开启并行复合上传选项,我们都建议您使用已编译的 crcmod 进行下载。

  • 存储分区中的复合对象没有 MD5 哈希值

按照 gsutil help crcmod 中的步骤配置和编译 crcmod 后,请配置 .boto 文件,以便默认启用并行复合上传功能。如需了解详细信息,请参阅 gsutil 配置,特别是要参阅 .boto 文件 GSUtil 部分的 parallel_composite_upload_* 设置。

如果您已启用并行复合上传,并且将大文件上传到存储分区,您会注意到,该文件在上传过程中被拆分成了多个大小为 50MB 的数据块(而不是单次上传整个文件)。如果发生任何故障(例如,临时网络问题导致的故障),您可以使用 no-clobber (-n) 标志重新运行复制,以便仅传输丢失的文件。

请记住,在检查存储分区中的文件(以复合对象的形式上传)的数据完整性时,该文件只有 CRC32c 哈希值,没有 MD5 值。

如果您配置了并行复合上传,则中止的上传操作可能会残留一些临时文件。如果您不想恢复上传,则可以删除以下临时文件:

gsutil -m rm gs://example-bucket/**/gsutil/tmp/parallel_composite_uploads/for_details_see/gsutil_help_cp**
此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Cloud Storage
需要帮助?请访问我们的支持页面