我们在谷歌计算引擎上有大约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个多小时,还有什么方法可以删除那些桶?
答案 0 :(得分:1)
回答你的第一个问题,我可以提出几个选择。所有这些都基于数据分割和上传一小部分数据。
在这种情况下,您将按安全块(如50GB)拆分数据,并将其从多台计算机并行上传。但它需要机器,实际上并不需要。
关于如何删除它们。好吧,和上传技术相同。在块上划分数据并按块删除它们。或者,如果适合您的情况,您可以尝试删除整个项目。
更新1
所以,我检查了gsutil接口,它支持glob语法。您可以匹配glob语法,例如200个文件夹,并启动此命令150次(这将上传200 x 500 = 30 000个文件夹)。
您可以使用此类方法并将其与-m
选项结合使用,因此这部分是您的脚本所做的,但可能会更快。这也适用于文件夹名称和文件。
如果您提供文件夹名称和文件名称的示例,则可以更容易地提出适当的glob模式。
答案 1 :(得分:0)
我刚遇到同样的问题,结果发现它是由cp
命令运行到一个不可复制的文件(在我的情况下,一个破损的符号链接)和中止引起的。
问题是,如果您使用-m
运行大规模并行副本,则损坏的文件可能不会立即显而易见。要确定它是哪一个,请尝试干运行rsync -n
:
gsutil -m rsync -n -r userFiles/ gs://removed-websites/
这将清楚标记损坏的文件并中止,您可以修复或删除它,然后重试。或者,如果您对符号链接不感兴趣,只需使用-e
选项,它们将被完全忽略。