gsutil 可以创建加速 gcsfuse 所需的伪目录条目吗?

Posted

技术标签:

【中文标题】gsutil 可以创建加速 gcsfuse 所需的伪目录条目吗?【英文标题】:Can gsutil create the psudeo-directory entries needed to speed up gcsfuse? 【发布时间】:2020-04-27 19:25:22 【问题描述】:

虽然 Google Cloud Storage 是一个不需要目录条目的平面对象存储,但添加伪目录占位符(名称以 / 结尾的空条目)使 gcsfuse 更快。您可以省略 gcsfuse --implicit-dirs 选项并以非常实用的性能浏览您的 GCS 目录,如果没有占位符,情况并非如此。

问。有没有办法向gsutil 发出命令,如gsutil cp -r your_directory gs://your-bucket/,在上传文件时创建目录占位符?

替代方法是调用 GCS API,但 gsutil 有很多有用的功能,包括并行上传和重试处理。

示例

制作本地树:

$ mkdir -p your_directory/subdir
$ echo hi > your_directory/hi.txt
$ echo there > your_directory/subdir/there.txt

$ ls -lR your_directory
total 8
-rw-r--r--  1 jerry  staff   3 Jan 21 17:24 hi.txt
drwxr-xr-x  3 jerry  staff  96 Jan 21 17:24 subdir/

your_directory/subdir:
total 8
-rw-r--r--  1 jerry  staff  6 Jan 21 17:24 there.txt

gsutil复制到GCS:

$ gsutil cp -r your_directory gs://your-bucket/
Copying file://your_directory/hi.txt [Content-Type=text/plain]...
Copying file://your_directory/subdir/there.txt [Content-Type=text/plain]...
/ [2 files][    9.0 B/    9.0 B]
Operation completed over 2 objects/9.0 B.

$ gsutil ls -lr gs://your-bucket/your_directory
gs://your-bucket/your_directory/:
         3  2020-01-22T01:25:38Z  gs://your-bucket/your_directory/hi.txt

gs://your-bucket/your_directory/subdir/:
         6  2020-01-22T01:25:38Z  gs://your-bucket/your_directory/subdir/there.txt
TOTAL: 2 objects, 9 bytes (9 B)

注意gsutil 只创建了 2 个对象(blob)——文本文件。它没有创建目录占位符 blob your_directory/your_directory/subdir/

gcsfuse your-bucket your-bucket 挂载:

$ find your_directory
find: your_directory: No such file or directory

gcsfuse --implicit-dirs your-bucket your-bucket 挂载:

$ find your_directory
your_directory
your_directory/hi.txt
your_directory/subdir
your_directory/subdir/there.txt

慢慢来。

回到gcsfuse your-bucket your-bucket 挂载,我们可以通过创建目录占位符来显示文本文件:

$ mkdir your_directory
$ ls your_directory
hi.txt

$ mkdir your_directory/subdir
$ ls your_directory
hi.txt  subdir/

$ ls your_directory/subdir/
there.txt

【问题讨论】:

您的性能问题是关于使用 gcsfuse 将存储桶绑定到本地目录的问题? @guillaumeblaquiere 是的,使用--implicit-dirs,即使列出 2 个文件的小目录也需要几秒钟。 gcsfuse 这样不切实际。 【参考方案1】:

如果我理解正确并且您想在创建看似空的文件夹时上传文件(在后台只是路径末尾带有“/”的空文件),gsutil cp -r your_directory gs://your-bucket/ 可以解决问题。

这里的参考是how subdirectories work in GCS和gsutil cp command

【讨论】:

谢谢,但是唉,除非有配置设置或其他选项,否则gsutil cp -r your_directory gs://your-bucket/ 不会创建空目录占位符对象your_directory/your_directory/subdir/ 等,因此gcsfuse (没有--implicit-dirs) 将看不到任何这些文件。 您能否澄清一下“空目录占位符对象”的含义? “空目录占位符对象”是指名称以 / 结尾的 0 长度 GCS blob。没有它们,gcsfuse 将看不到your-bucket/your_directory 或其“内容”(除非使用--implicit-dirs 选项安装)。查看我添加到问题中的示例,并查看github.com/GoogleCloudPlatform/gcsfuse/blob/master/docs/…

以上是关于gsutil 可以创建加速 gcsfuse 所需的伪目录条目吗?的主要内容,如果未能解决你的问题,请参考以下文章

文件夹未显示在存储桶存储中

寻找简单的集群配置

GCP 存储桶可在 UI 中访问,但不能通过 Cloud Shell 中的 gcsfuse

使用 gcsfuse 安装在 Compute Engine 实例上的 Google Cloud Bucket 不会创建文件

Neo4J与NeoModel:如何加速图形创建?

sql的优化-索引