【发布时间】:2018-11-04 01:53:51
【问题描述】:
我正在尝试使用 gsutil mv 从各种存储桶中移动 1500 万个文件 (4TB)。不幸的是,以前的文件名不共享 any 通用前缀;相反,它们都以我们的“文件类型”标识符为后缀。
在此传输过程中,我也打算重命名文件以防止将来发生这种混乱。
这是我们当前的文件格式:
gs://{bucket}/{hash}-{filetype}.{extn}
这是我将它们重命名为的格式:
gs://{bucket}/{filetype}/{hash}.{extn}
当前解决方案:
因为目前的格式不利于“前缀”选择器,所以我不得不做以下事情:
let { stdout } = spawn('gsutil', ['ls', `${OLD_BUCKET}/*-${TYPE}`]);
createInterface({ input:stdout }).on('line', str => {
if (!str.length) return;
let [hash] = str.replace(OLD_BUCKET, '').split('-');
let nxt = `${NEW_BUCKET}/${TYPE}/${hash}.${extn}`;
spawnSync('gsutil', ['mv', str, nxt]);
});
为简洁起见,略作编辑。
奇怪的是,gsutil ls 是唯一可以识别基于 glob 的模式的命令。利用这一点,我将每条线路通过管道传输到我的“格式转换器”中,然后使用gsutil mv 启动传输。
此操作在 16 核机器上运行,每个核执行相同的任务 -- 但ls'ing 使用不同的文件类型。
问题
这太慢了!
我已经投入了更多的服务器和更多的内核,而且我无法在每个文件类型每分钟破坏 26 个文件。我还尝试将-m 标志添加到gsutil mv,没有区别——因为mv 每行调用一次。
我们有 13 种文件类型;因此每小时传输 20,280 个文件。将此与 GCP 的“传输”工具进行比较,后者在不到一个小时内将 500 万个文件从 BucketA复制到 BackupA。
问题
有什么办法可以加快速度吗?
按照目前的费率,我正在等待 15 天,直到转账完成,按小时支付????
【问题讨论】:
-
由于您的 mv 命令只是在等待 GCS 完成工作,我认为您可以在每个核心上运行超过 1 个命令。希望您可以通过这种方式实现更多并行化。
-
你会这么想的,是的。但是每个核心运行 2 个会导致
EAGAIN错误。这就是为什么我又启动了另外 3 台机器,每台机器有 16 个内核。即使所有 4 个服务器都在运行(每个文件类型 4 个mv),每个单独的存储桶也被限制为每分钟约 26 个文件。 AKA 在机器之间并行化负载的收益为 0。 -
这很有趣。感谢您的评论,我去寻找人为的速率限制并找到了这些文档。 cloud.google.com/storage/docs/request-rate#ramp-up
标签: google-cloud-platform google-cloud-storage gsutil