将 Cloud Storage 用于大数据

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

  • 将数据加载到 BigQuery 中。

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

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

Dataflow 需要 Cloud Storage 存储分区才能运行。对于 BigQuery 和 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

共享存储分区中的数据

处理大数据时,您可能会协同处理文件,并且您需要能够为特定的人员或群组提供访问权限。Identity and Access Management 政策定义了哪些人可以访问您的文件以及他们可以执行哪些操作。您可以使用 gsutil iam 命令查看存储分区的 IAM 政策:

gsutil iam get gs://example-bucket

对命令的响应会显示成员(获授予对您的存储分区的访问权限的帐号)以及角色(向成员授予的权限组)。

您可以配置存储分区,使得拥有 Google 帐号的任何人都可以列出和查看存储分区中的文件。

gsutil iam ch AllAuthenticatedUsers:objectViewer gs://example-bucket

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

公开共享

如果存储分区的内容设计为可由互联网上的任何人列出和读取,您可以使用指定的“AllUsers”来配置 IAM 政策:

gsutil iam ch AllUsers:objectViewer gs://example-bucket

与群组共享

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

gsutil iam ch group:gs-announce@googlegroups.com:objectViewer gs://example-bucket

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

与他人共享

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

gsutil iam ch user:liz@gmail.com:objectViewer gs://example-bucket

显示存储分区中的数据量

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

gsutil du -sh gs://example-bucket

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

如果每天自动报告一次存储分区的总大小,您还可以使用 Cloud Monitoring。如需了解详情,请参阅确定存储分区的大小。如果存储分区中的对象数量较大(例如,数十万或数百万),则您可以通过此方法来更有效地跟踪存储空间使用情况。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 值。