如何使用弹性集群,网格引擎工具和谷歌云将文件列表压缩为单个gzip文件

时间:2016-07-15 22:24:00

标签: google-cloud-storage google-genomics

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

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

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

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

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

修改

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

3 个答案:

答案 0 :(得分:1)

我可以说明问题的定义,如果我理解正确的话你可以告诉我,因为Matt和我都提供了完全相同的解决方案,并且它似乎不够。

问题定义

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

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

如果我对其进行了适当的总结,请告诉我,

谢谢, 保罗

答案 1 :(得分:0)

所以有很多方法可以做到这一点,但问题是你无法直接在Google Storage上压缩文件集合或目录到一个文件中,并且需要在转移之前在本地执行tar / gzip组合它

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

gsutil cp -Z

以下链接详细说明:

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

好的一点是,您可以从Google Storage上的压缩数据中检索未压缩的结果,因为它可以执行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云端存储:

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

您需要首先在本地临时目录中的文件上执行tar / zip,然后gsutil将压缩文件复制到Google Storage,但要确保 所有文件<需要压缩的/ em> 在开始压缩之前位于暂存目录中。很可能你需要将它们SSH(scp)SSH复制到其中一个节点(即master),然后让master tar / gzip整个目录,然后再发送到Google Storage。我假设每个GCE实例都有自己的暂存盘,但在GCE上工作时,“gsutil cp”传输速度非常快。

由于谷歌存储与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”将压缩的目录文件复制回存储桶。

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

答案 2 :(得分:0)

  • 云存储中有问题的文件吗?
  • 本地或网络硬盘上有问题的文件吗?

在您的描述中,您指出“我需要的是将多个文件压缩为单个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

更新:

在更新的问题说明中,您已表明可能同时处理了多个订单。如果需要定位结果的频率很低,并且提供目标结果并不是非常时间敏感的,那么您可以使用单个节点执行此操作。

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

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

对Pipelines API的调用将启动一个VM,其唯一目的是下载客户的文件,将其tar起来,并将生成的tar文件推送到Cloud Storage。 Pipelines API基础架构为您执行从云存储复制到云存储。您实际上只需要提供tar命令行。

这里有一个类似的例子:

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

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

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

-Matt