将 Cloud Storage 用于大数据

在 Google Cloud 上存储和使用大数据时,Cloud Storage 发挥着关键作用。例如,您可以使用 Cloud Storage 加载数据到 BigQuery,保存 Dataflow 流水线的暂存文件和临时数据,以及与 Dataproc 集成,以便可以直接对 Cloud Storage 中的数据运行 Apache Hadoop 或 Apache Spark 作业。

本页面介绍了如何使用 gcloud 命令行工具完成大数据任务,例如复制大型文件或并行复制许多文件。如需了解 gcloud 简介,请参阅 gcloud 快速入门

须知事项

为充分利用此页面上显示的示例,您需要完成以下任务(如果您尚未完成):

将多个文件复制到存储桶中

cp 命令会根据需要自动执行并行(多线程/多处理)复制,从而有效上传大量文件。如需递归复制子目录,请在该命令中使用 --recursive 标志。例如,如需将文件(包括子目录)从名为 top-level-dir 的本地目录复制到存储桶中,您可以使用以下命令:

gcloud storage cp top-level-dir gs://example-bucket --recursive

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

gcloud storage cp top-level-dir/subdir/image* gs://example-bucket --recursive

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

gcloud storage rm gs://example-bucket/top-level-dir/subdir/image*

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

gcloud storage cp gs://example-bucket/top-level-dir/subdir/** gs://example-bucket/top-level-dir/subdir/subdir2

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

同步本地目录

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

gcloud storage rsync local-dir gs://example-bucket --recursive

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

将大文件复制到存储桶中

通常,在处理大数据时,当您的数据进入云中之后,它会保留在云中。在您的数据进入 Google Cloud 之后,您可以非常迅速地将该数据传输到同一位置的其他服务(比如 Compute Engine)。

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

gcloud storage cp local-file gs://example-bucket

如需从现有存储桶复制大文件,请使用以下命令:

gcloud storage cp gs://example-source-bucket/file  gs://example-destination-bucket

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

配置存储桶

建议配置存储桶的大数据任务包括:将数据移动到其他存储类别、配置对象版本控制,或设置生命周期规则

您可以使用 buckets describe 列出存储桶的配置详细信息:

gcloud storage buckets describe gs://example-bucket

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

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

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

echo '{ "rule": [{ "action": {"type": "Delete"}, "condition": {"age": 1}}]}' > lifecycle_config.json
gcloud storage buckets update gs://example-bucket --lifecycle-file=lifecycle_config.json

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

gcloud storage buckets describe gs://example-bucket

共享存储桶中的数据

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

gcloud storage buckets get-iam-policy gs://example-bucket

该命令的响应会显示主账号(被授予对存储桶的访问权限的账号)和角色(向主账号授予的权限组)。

共享数据的三种常见场景包括公开共享、与群组共享以及与他人共享:

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

    gcloud storage buckets add-iam-policy-binding gs://example-bucket --member=allUsers --role=roles/storage.objectViewer

  • 与群组共享:如果协作者无权访问您的其他 Google Cloud 资源,我们建议您创建一个 Google 群组,然后将该 Google 群组添加到存储桶中。例如,如需授予对 my-group Google 群组的访问权限,您可以配置以下 IAM 政策:

    gcloud storage buckets add-iam-policy-binding gs://example-bucket --member=group:my-group@googlegroups.com --role=roles/storage.objectViewer

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

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

    gcloud storage buckets add-iam-policy-binding gs://example-bucket --member=user:liz@gmail.com --role=roles/storage.objectViewer

清理存储桶

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

gcloud storage rm gs://example-bucket/ --recursive

处理校验和

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

您可以使用 gcloud storage 获取存储桶中对象的校验和。例如,假设您使用以下命令将 Landsat 公开数据对象复制到工作存储桶:

gcloud storage cp gs://gcp-public-data-landsat/LC08/01/001/003/LC08_L1GT_001003_20140812_20170420_01_T2/LC08_L1GT_001003_20140812_20170420_01_T2_B3.TIF gs://example-bucket

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

gcloud storage objects describe gs://example-bucket/LC08_L1GT_001003_20140812_20170420_01_T2_B3.TIF
gcloud storage objects describe gs://gcp-public-data-landsat/LC08/01/001/003/LC08_L1GT_001003_20140812_20170420_01_T2/LC08_L1GT_001003_20140812_20170420_01_T2_B3.TIF

您还可以使用 gcloud storage 计算本地文件的校验和。例如,假设您的数据位于本地数据中心的文件中,并且您已将该文件复制到 Cloud Storage。您可以使用 gcloud storage hash 获取本地文件的校验和,然后将该校验和与您复制到存储桶中的文件的校验和进行比较。如需获取本地文件的校验和,请使用以下命令:

gcloud storage hash local-file

MD5 值

对于非复合对象,对存储桶中的对象运行 gcloud storage objects describe 会返回如下输出:

bucket: example-bucket
contentType: text/plain
crc32c: FTiauw==
customTime: '1970-01-01T00:00:00+00:00'
etag: CPjo7ILqxsQCEAE=
generation: '1629833823159214'
id: example-bucket/100MBfile.txt/1629833823159214
kind: storage#object
md5Hash: daHmCObxxQdY9P7lp9jj0A==
...

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

---
crc32c_hash: IJfuvg==
digest_format: base64
md5_hash: +bqpwgYMTRn0kWmp5HXRMw==
url: file.txt

两个输出都具有 CRC32c 和 MD5 值。复合对象(例如通过并行复合上传创建的对象)没有 MD5 值。

后续步骤