问题描述
我的目标:我有数百个 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
构建选项根据您的文件大小要求设置正确的磁盘大小。
数据流模板仅对每个文件进行统一压缩,不创建存档。