如何使用 elasticluster、grid-engine-tools 和 google cloud 将文件列表压缩到单个 gzip 文件中

How to compress a list of files into a single gzip file using elasticluster, grid-engine-tools, and google cloud

首先,我想提前感谢大家的帮助,因为这将有助于清理 the readthedocs.io guide 中遗漏的细节。我需要的是将几个文件压缩到一个 gzip 中,但是,该指南仅显示如何将文件列表压缩为单个 gzip 文件。再次感谢任何帮助,因为此设置的资源和文档很少。 (如果有一些额外的信息,请包括来源链接)

设置网格引擎后,我 运行 浏览了指南中的示例。

我假设没有使用 grid-computing-tools 将多个文件合并到一个 gzip 中的脚本是否正确?

在 Elasticluster Grid Engine 设置上是否有任何解决方案可以将多个文件压缩为 1 个 gzip?

可以对 grid-engine-tools 进行哪些更改以使其正常工作?

编辑

我们考虑集群的原因是我们确实希望同时发生多个操作,每个订单压缩文件,这将系统地发生,以便供应商可以每个订单下载一个压缩文件。

所以有很多方法可以做到这一点,但问题是你不能直接压缩 Google 存储一组文件 - 或目录 - 到一个文件中,并且需要执行 tar/gzip 传输之前在本地组合。

如果您愿意,可以通过以下方式自动压缩数据:

gsutil cp -Z

具体如下link:

https://cloud.google.com/storage/docs/gsutil/commands/cp#changing-temp-directories

而且好处是您可以从 Google 存储上的压缩数据中检索未压缩的结果,因为它能够执行 Decompressive Transcoding:

https://cloud.google.com/storage/docs/transcoding#decompressive_transcoding

您会注意到以下脚本的最后一行:

https://github.com/googlegenomics/grid-computing-tools/blob/master/src/compress/do_compress.sh

以下行基本上会将当前压缩文件复制到Google Cloud Storage:

gcs_util::upload "${WS_OUT_DIR}/*" "${OUTPUT_PATH}/"

您需要先对本地暂存目录中的文件执行tar/zip,然后gsutil 将压缩文件复制到Google 存储,但请确保所有需要压缩的文件都在scratch目录下才开始压缩。您很可能需要通过 SSH 将它们复制 (scp) 到其中一个节点(即主节点),然后让主节点 tar/gzip 整个目录,然后再将其发送到 Google 存储。我假设每个 GCE 实例都有自己的暂存盘,但是在 GCE 上工作时 "gsutil cp" 传输非常快。

由于 Google 存储在 Google 计算实例的数据传输中速度很快,最简单的第二个选择是在 do_compress.sh 文件中标记出第 66-69 行:

https://github.com/googlegenomics/grid-computing-tools/blob/master/src/compress/do_compress.sh

这种方式不会发生压缩,但复制会通过 gsutil::upload 在最后一行发生,以便将所有未压缩的文件传输到同一个 Google 存储桶。然后使用来自主节点的 "gsutil cp" 将它们复制回本地,以便通过 tar/gz 在本地压缩它们,然后使用 "gsutil cp".[= 将压缩的目录文件复制回存储桶18=]

希望它有所帮助,但它很棘手, 保罗

  • 有问题的文件在云存储中吗?
  • 有问题的文件是在本地还是网络驱动器上?

在您的描述中,您指出 "What I need is to compress several files into a single gzip"。我不清楚为此需要一组计算机。听起来更像是您只想使用 tar along with gzip.

tar 实用程序将创建一个存档文件,它也可以压缩它。例如:

$ # Create a directory with a few input files
$ mkdir myfiles
$ echo "This is file1" > myfiles/file1.txt
$ echo "This is file2" > myfiles/file2.txt

$ # (C)reate a compressed archive
$ tar cvfz archive.tgz myfiles/*
a myfiles/file1.txt
a myfiles/file2.txt

$ # (V)erify the archive
$ tar tvfz archive.tgz 
-rw-r--r--  0 myuser mygroup      14 Jul 20 15:19 myfiles/file1.txt
-rw-r--r--  0 myuser mygroup      14 Jul 20 15:19 myfiles/file2.txt

要提取内容,请使用:

$ # E(x)tract the archive contents
$ tar xvfz archive.tgz 
x myfiles/file1.txt
x myfiles/file2.txt

更新:

在您更新的问题描述中,您指出您可能同时处理了多个订单。如果结果需要 tar-ed 的频率很低,并且提供 tar-ed 结果对时间不是非常敏感,那么您可以使用单个节点来完成此操作。

但是,随着问题规模的扩大,您可以考虑使用 Pipelines API

您可以在客户订单完成时启动 "pipeline"(在本例中为单个任务),而不是保持固定集群 运行。

调用管道 API 会生成一个 VM,其唯一目的是下载客户的文件,tar 将它们上传,然后推送结果 tar 文件到云存储。 Pipelines API 基础架构为您执行从云存储到云存储的复制。您实际上只需要提供 tar 命令行。

此处有一个执行类似操作的示例:

https://github.com/googlegenomics/pipelines-api-examples/tree/master/compress

此示例将下载文件列表并单独压缩每个文件。它可以很容易地修改为 tar 输入文件列表。

查看 https://github.com/googlegenomics/pipelines-api-examples github 存储库以获取更多信息和示例。

-马特

我可以说明问题的定义吗,如果我理解正确,你可以告诉我,因为马特和我提供了完全相同的解决方案,但不知何故似乎还不够。

问题定义

  • 您有一个订单定义了处理某些数据的任务的开始。
  • 数据处理将在几个计算节点之间进行拆分,每个计算节点都会生成一个结果文件,存储在 GS 目录中。
  • 目标是:

    1. 从 GS 桶中收集文件(由每个节点生成),
    2. 将文件集合归档为一个文件,
    3. 然后压缩该存档,
    4. 将其推回不同的 GS 位置。

如果我总结得当,请告诉我,

谢谢, 保罗