如果我想读取几个文件,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 在这里不是最优的。
要保持高请求率,请避免使用顺序名称。使用随机对象名称可以更好地分配负载。
我希望从 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 在这里不是最优的。
要保持高请求率,请避免使用顺序名称。使用随机对象名称可以更好地分配负载。