如果我想读取几个文件,Google Cloud Storage 是否会扫描整个存储桶?

Does Google Cloud Storage scan the entire bucket if I want read a few files?

我希望从 Hive 迁移到 Google Cloud Storage。上游作业正在 HDFS 中转储文件。在 Hive 中,我在 HDFS 上维护分区,并且在查询时仅扫描特定分区。

在GCS上,我了解到没有文件夹的概念。因此,如果我将文件转储到路径结构与我在 HDFS 中的路径结构相匹配的存储桶中,如下所示:

gs://my-bucket/year=2021/month=12/day=6/a.txt
gs://my-bucket/year=2021/month=12/day=7/b.txt
gs://my-bucket/year=2021/month=12/day=8/c.txt

此数据会随着时间不断增长。现在,如果我想查询这个桶只取今天写的文件,GCS 是否在内部扫描整个桶(因为没有文件夹,每个文件都是一个对象)?

我的用例每天写入数 TB 的数据,最常见的消费模式是访问 'yesterday' 数据。

如何在 GCS 上为我的存储建模?

深入了解云存储很有趣。您在存储管理中有 2 个部分:

  • 数据自己存储
  • 元数据管理

存储本身在这里并不有趣。它基于 Colossus 存储系统,google 内部可以存储任何东西。

元数据管理比较有意思。事实上,您有一个引用所有文件的数据库以及部件存储在 Colossus 中的位置。

元数据存储在 BigTable 上,关键是你的文件名(这可以解释很多事情,特别是热点如果你的文件名太相似,你总是使用相同的 BigTable 节点并创建一个热点)。

无论如何,因为键是你的文件名,你只能通过键的前缀搜索(BigTable 允许)。因此,如果您想要特定日期的文件,可以按前缀 year=2021/month=12/day=8/.

进行搜索

因此,存储桶并未完全扫描,仅扫描元数据数据库,这样您只能获取所需的文件。

正如@John Hanley 提到的,naming convention 在这里不是最优的。

要保持​​高请求率,请避免使用顺序名称。使用随机对象名称可以更好地分配负载。