我应该如何处理这个 gsutil“并行复合上传”警告?

Posted

技术标签:

【中文标题】我应该如何处理这个 gsutil“并行复合上传”警告?【英文标题】:What should I do about this gsutil "parallel composite upload" warning? 【发布时间】:2018-04-13 02:19:17 【问题描述】:

我正在运行 python 脚本并使用 os 库来执行 gsutil 命令,该命令通常在 Windows 的命令提示符下执行。我的本地计算机上有一些文件,我想将其放入Google Bucket,所以我这样做了:

导入操作系统

command = 'gsutil -m cp myfile.csv  gs://my/bucket/myfile.csv'
os.system(command)

我收到如下消息:

==> 注意:您正在上传一个或多个大文件,如果您启用并行复合上传,这些文件的运行速度会明显加快。这 功能可以通过编辑启用 .boto 中的“parallel_composite_upload_threshold”值 配置文件。但是,请注意,如果您这样做,大文件将 作为“复合对象”上传 https://cloud.google.com/storage/docs/composite-objects'_,哪个 意味着任何下载此类对象的用户都需要拥有 安装已编译的 crcmod(参见“gsutil help crcmod”)。这是因为 如果没有编译的 crcmod,计算复合对象的校验和是 太慢了,以至于 gsutil 禁用了复合对象的下载。

如果它与实际执行的建议无关,我想通过隐藏它来消除此消息,但我找不到 .boto 文件。我该怎么办?

【问题讨论】:

你的代码比性能问题更大——如果你没有严格控制你的文件名,它也可能被用于安全漏洞(提供一个具体的例子,尝试上传使用touch '$(rm -rf ~).csv' 创建的文件不会顺利)。使用subprocess.Popen 或不带shell=True 的派生类要安全得多,将命令行的每一段作为单独的列表元素传递。 【参考方案1】:

gsutil 文档的Parallel Composite Uploads 部分描述了如何解决此问题(假设如警告所示,此内容将由具有可用crcmod 模块的客户端使用):

gsutil -o GSUtil:parallel_composite_upload_threshold=150M cp bigfile gs://your-bucket

要从 Python 安全地执行此操作,如下所示:

filename='myfile.csv'
gs_bucket='my/bucket'
parallel_threshold='150M' # minimum size for parallel upload; 0 to disable

subprocess.check_call([
  'gsutil',
  '-o', 'GSUtil:parallel_composite_upload_threshold=%s' % (parallel_threshold,),
  'cp', filename, 'gs://%s/%s' % (gs_bucket, filename)
])

请注意,这里您明确地提供了参数向量边界,而不是依赖 shell 来为您执行此操作;这可以防止恶意或错误的文件名执行不希望的操作。


如果您不知道访问此存储桶中内容的客户端将具有crcmod 模块,请考虑在上面设置parallel_threshold='0',这将禁用此支持。

【讨论】:

感谢您的回复,您是否同意如果bigfile的大小小于150M,那么上传命令仍然有效? 是的;在这种情况下它根本不会并行化。 如果在python中,使用python api而不是subprocess -> cli不是更好吗? googleapis.github.io/google-cloud-python/latest/storage/… @CosminLehene,听起来是添加您自己的答案的好理由。 所以如果你设置了GSUtil:parallel_composite_upload_threshold,你不应该使用-m标志,对吧?【参考方案2】:

另一种方法是在BOTO_PATH 的文件中设置提示中所说的配置。通常是$HOME/.boto

[GSUtil]
parallel_composite_upload_threshold = 150M

要获得最大速度,请安装 crcmod C 库

【讨论】:

以上是关于我应该如何处理这个 gsutil“并行复合上传”警告?的主要内容,如果未能解决你的问题,请参考以下文章

我可以/应该如何处理这个 git gc 错误? (rm:无法取消链接包权限被拒绝)

我应该如何处理“TypeError:store.addListener 不是函数”错误

我应该如何处理 iOS 中的 ASIHTTPRequest 异步调用?

firebase、flutter应该如何处理好友请求和邀请? [关闭]

开/关原则——如何处理这个开关?

您应该如何处理跨微服务的身份验证和共享用户信息?