1

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

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

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

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

可以对网格引擎工具进行哪些更改以使其正常工作?

编辑

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

4

3 回答 3

1

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

问题定义

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

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

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

谢谢,保罗

于 2016-07-26T16:49:06.817 回答
0

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

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

gsutil cp -Z

在以下链接中进行了详细说明:

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

好消息是您可以从 Google Storage 上的压缩数据中检索未压缩的结果,因为它能够执行解压缩转码

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 Storage,但确保所有需要压缩的文件都在暂存目录中在开始压缩它们之前。您很可能需要将它们通过 SSH 复制 (scp) 到其中一个节点(即主节点),然后让主节点对整个目录进行 tar/gzip 压缩,然后再将其发送到 Google 存储。我假设每个 GCE 实例都有自己的暂存盘,但是在 GCE 上工作时“gsutil cp”传输非常快。

由于 Google Storage 在与 Google Compute 实例的数据传输方面速度很快,因此最简单的第二种选择是在do_compress.sh文件中标记出第 66-69 行:

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

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

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

于 2016-07-16T23:27:53.013 回答
0
  • 有问题的文件是否在 Cloud Storage 中?
  • 有问题的文件是在本地驱动器还是网络驱动器上?

在您的描述中,您指出“我需要将几个文件压缩成一个 gzip”。我不清楚为此需要一组计算机。这听起来更像是您只想将targzip一起使用。

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 的频率很低,并且提供 tar 的结果对时间不是非常敏感,那么您可能会使用单个节点来执行此操作。

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

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

对 Pipelines API 的调用将启动一个 VM,其唯一目的是下载客户的文件,将它们打包,然后将生成的 tar 文件推送到 Cloud Storage。Pipelines API 基础架构为您执行从 Cloud Storage 复制到 Cloud Storage 的复制操作。您实际上只需要提供 tar 命令行。

这里有一个类似的例子:

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

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

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

-马特

于 2016-07-20T22:27:06.747 回答