有没有办法使用 Google Cloud 将文件文件夹压缩为一个 zip、gzip、bzip 等文件?

问题描述

我的目标我有数百个 Google Cloud Storage 文件夹,其中包含数百张图片。我需要能够将它们压缩并通过电子邮件用户发送一个指向单个 zip 文件链接

我尝试使用 PHP 的 zip 功能在外部服务器上压缩这些文件,但事实证明,鉴于我创建的 zip 文件的最终大小,这是徒劳的。

此后我发现 Google Cloud 提供了批量压缩云存储文件实用程序(文档位于 https://cloud.google.com/dataflow/docs/guides/templates/provided-utilities#api)。我能够成功调用这个实用程序,但是为了将每个文件压缩到它自己的 bzip 或 gzip 文件中。

例如,如果我尝试压缩的文件夹中有以下文件

  • 苹果.jpg
  • 香蕉.jpg
  • 胡萝卜.jpg

生成的 outputDirectory 将具有:

  • apple.bzip2
  • banana.bzip2
  • carrot.bzip2

最终,我希望创建一个名为 fruits.bzip2文件,该文件可以解压缩以显示这三个文件

这是我对 https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/templates:launch?gcsPath=gs://dataflow-templates/latest/Bulk_Compress_GCS_Files 设置的请求参数的示例

{
  "jobName": "ziptest15","environment": {
    "zone": "us-central1-a"
  },"parameters": {
    "inputFilePattern": "gs://PROJECT_ID.appspot.com/testing/samplefolder1a/*.jpg","outputDirectory": "gs://PROJECT_ID.appspot.com/testing/zippedfiles/","outputFailureFile": "gs://PROJECT_ID.appspot.com/testing/zippedfiles/failure.csv","compression": "BZIP2"
  }
}

解决方法

实现这一目标的最佳方法是创建一个应用:

  • 本地下载一个GCS前缀的所有文件(你命名为“目录”但目录在GCS上不存在,只有具有相同前缀的文件)
  • 创建一个存档(可以是 ZIP 或 TAR。ZIP 不会真正压缩图像。图像格式已经是一种压缩格式。你特别想要一个包含所有图像的 1)
  • 将档案上传到 GCS
  • 清理文件

现在您必须选择在何处运行此应用。

  • 在 Cloud Run 上,您受到内存空间的限制(目前,新功能即将推出)。目前,您的内存限制为 8Gb(很快将达到 16Gb),您的应用程序将能够处理 45% 的内存容量(图像大小的 45%,存档大小的 45%,存档大小的 10%)应用程序内存占用。)。将并发参数设置为 1。
  • 如果您需要更多空间,可以使用 Compute Engine。
    • 设置一个 startup script 来运行您的脚本并在最后自动停止虚拟机。脚本从元数据服务器读取参数并使用正确的参数运行您的应用
    • 在每次运行之前,使用要处理的目录(可能还有其他应用程序参数)更新 Compute Engine metadata
    • -> 问题是您一次只能运行 1 个进程。或者你需要为每个job创建一个VM,然后在启动脚本的最后删除VM而不是停止VM
  • 另一种解决方案是使用 Cloud Build。使用替换变量中的参数运行构建并在 Cloud Build 中执行作业。您只能并行构建 10 个。使用 diskSizeGb 构建选项根据您的文件大小要求设置正确的磁盘大小。

数据流模板仅对每个文件进行统一压缩,不创建存档。