多线程的gsutil副本没有完成复制所有文件

时间:2017-12-05 16:49:44

标签: multithreading google-cloud-platform google-cloud-storage

我们在谷歌计算引擎上有大约650 GB的数据。

我们需要将它们移动到Cloud Storage到Coldline存储桶,因此我们可以找到的最佳选择是使用并行模式的gsutil复制它们。

文件从千字节到最大10Mb,并且有几百万个文件。

我们使用的命令是

gsutil -m cp -r userFiles/ gs://removed-websites/

首次运行时,它复制了大约200Gb并因错误而停止

| [972.2k/972.2k files][207.9 GiB/207.9 GiB] 100% Done 29.4 MiB/s ETA 00:00:00 Operation completed over 972.2k objects/207.9 GiB.
CommandException: 1 file/object could not be transferred.

在第二次运行时,它几乎在同一个地方完成,并再次停止。

我们如何成功复制这些文件?

删除后,也不会删除具有部分数据的存储桶。控制台只是说准备删除,没有任何反应,我们等了4个多小时,还有什么方法可以删除那些桶?

2 个答案:

答案 0 :(得分:1)

回答你的第一个问题,我可以提出几个选择。所有这些都基于数据分割和上传一小部分数据。

  1. 您可以尝试从多台计算机进行分布式上传。 https://cloud.google.com/storage/docs/gsutil/commands/cp#copying-tofrom-subdirectories-distributing-transfers-across-machines
  2. 在这种情况下,您将按安全块(如50GB)拆分数据,并将其从多台计算机并行上传。但它需要机器,实际上并不需要。

    1. 您仍然可以在一台计算机上尝试这种拆分上传,但是您需要一些拆分机制,它不会一次上传所有文件,而是通过块。在这种情况下,如果某些操作失败,您将只需要重新加载此块。此外,您将获得更高的准确性,并且如果发生某些事情,您将能够本地化可能的失败位置。
    2. 关于如何删除它们。好吧,和上传技术相同。在块上划分数据并按块删除它们。或者,如果适合您的情况,您可以尝试删除整个项目。

      更新1

      所以,我检查了gsutil接口,它支持glob语法。您可以匹配glob语法,例如200个文件夹,并启动此命令150次(这将上传200 x 500 = 30 000个文件夹)。

      enter image description here

      您可以使用此类方法并将其与-m选项结合使用,因此这部分是您的脚本所做的,但可能会更快。这也适用于文件夹名称和文件。 如果您提供文件夹名称和文件名称的示例,则可以更容易地提出适当的glob模式。

答案 1 :(得分:0)

我刚遇到同样的问题,结果发现它是由cp命令运行到一个不可复制的文件(在我的情况下,一个破损的符号链接)和中止引起的。

问题是,如果您使用-m运行大规模并行副本,则损坏的文件可能不会立即显而易见。要确定它是哪一个,请尝试干运行rsync -n

gsutil -m rsync -n -r userFiles/ gs://removed-websites/

这将清楚标记损坏的文件并中止,您可以修复或删除它,然后重试。或者,如果您对符号链接不感兴趣,只需使用-e选项,它们将被完全忽略。