布局

对象存储 (OBS)

师成师成· 更新于 2026-09-28· 阅读 8 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

1. 概述

对象存储(Object Store)桶布局将键(key)连同其完整路径名存储在扁平的命名空间中,针对 S3 兼容的访问模式进行了优化。每个键都独立存储,并保留其完整路径(例如 dir1/dir2/file.txt),这一点与 Amazon S3 类似。

与文件系统优化(FSO)桶不同,对象存储桶:

  • 不会创建中间目录条目
  • 完全按照提供的原样保留键名(不做路径规范化)
  • 优先保证 S3 API 兼容性,而非文件系统语义

note

Apache Ozone 支持三种桶布局类型:

  • OBJECT_STORE (OBS)、FILE_SYSTEM_OPTIMIZED (FSO) 以及 LEGACY(用于向后兼容的已弃用布局)。

2. 工作原理

  • 键以其完整路径名作为单个条目存储。创建 dir1/dir2/file.txt 时,只会存储该键本身——不会创建任何中间目录。
  • 操作支持基于前缀的列举和过滤。键是相互独立的对象——删除其中一个不会影响其他键,即使它们共享相同的前缀。
  • 对象存储是通过 S3 网关创建的桶的默认布局,以确保 S3 API 兼容性。

示例:创建键

当您在对象存储桶中创建键时:

# Create these keys:
ozone sh key put /myvolume/mybucket/images/photo1.jpg photo1.jpg
ozone sh key put /myvolume/mybucket/images/subfolder/photo3.jpg photo3.jpg
ozone sh key put /myvolume/mybucket/data/2024/01/report.json report.json

KeyTable 中将包含三个独立的条目:

  • /myvolume/mybucket/images/photo1.jpg
  • /myvolume/mybucket/images/subfolder/photo3.jpg
  • /myvolume/mybucket/data/2024/01/report.json

不会创建任何中间目录 —— 这些路径(images/、images/subfolder/、data/2024/01/)仅仅是键名本身的一部分。

与文件系统优化布局的对比:

Object Store (OBS) Structure:          File System Optimized (FSO) Structure:
┌─────────────────────────┐            ┌─────────────────────────┐
│      KeyTable           │            │    DirectoryTable       │
│  (Flat, full paths)     │            │  (Hierarchical IDs)     │
│                         │            │                         │
│ /vol/bucket/dir/file    │            │ /volID/bucketID/dirID   │
│ /vol/bucket/dir/file2   │            │ /volID/bucketID/dir2ID  │
│ /vol/bucket/dir2/file3  │            │                         │
└─────────────────────────┘            │      FileTable          │
                                       │  (Files with parent IDs) │
                                       │                         │
                                       │ dirID/file              │
                                       │ dirID/file2             │
                                       │ dir2ID/file3            │
                                       └─────────────────────────┘

3. 命令行操作

创建对象存储桶

要创建使用对象存储布局的存储桶,请使用 --layout 选项,取值为 obs 或 OBJECT_STORE:

# Using short form 'obs'
ozone sh bucket create /myvolume/mybucket --layout obs

# Using full form 'OBJECT_STORE'
ozone sh bucket create /myvolume/mybucket --layout OBJECT_STORE

示例:

$ ozone sh bucket create /s3v/myapp-data --layout obs
Bucket myapp-data is created

检查存储桶布局

要验证现有存储桶的布局,可使用 bucket info 命令:

ozone sh bucket info /myvolume/mybucket

输出将包含 bucketLayout 字段:

{
  "volumeName" : "myvolume",
  "name" : "mybucket",
  "bucketLayout" : "OBJECT_STORE",
  "storageType" : "DISK",
  "versioning" : false,
  "creationTime" : "2024-01-15T10:30:00.000Z",
  "modificationTime" : "2024-01-15T10:30:00.000Z"
}

删除密钥

从对象存储(Object Store)存储桶中删除密钥:

# Delete a single key
ozone sh key delete /myvolume/mybucket/dir1/dir2/file.txt

# Delete multiple keys (requires prefix matching)
ozone sh key delete /myvolume/mybucket/dir1/ --recursive

注意:--recursive 标志会删除具有指定前缀的所有键,但这并非原子操作——它会逐个删除键。

删除存储桶

删除一个对象存储桶:

# Delete empty bucket
ozone sh bucket delete /myvolume/mybucket

# Delete bucket with all keys (recursive)
ozone sh bucket delete /myvolume/mybucket --recursive

警告:递归删除会永久移除存储桶中的所有键,且无法恢复。

4. 配置

默认存储桶布局

创建存储桶时,若未指定 --layout 选项,可以配置所使用的默认存储桶布局。请在 ozone-site.xml 中进行设置:

<property>
  <name>ozone.default.bucket.layout</name>
  <value>OBJECT_STORE</value>
</property>

S3 网关默认布局

对于通过 S3 网关创建的存储桶,请配置默认布局:

<property>
  <name>ozone.s3g.default.bucket.layout</name>
  <value>OBJECT_STORE</value>
</property>

5. 限制

使用对象存储(Object Store)桶布局时,请注意以下限制:

  • 不支持原子重命名(需要执行复制并删除操作)
  • 不支持原子目录删除
  • 不支持目录操作(目录是键名的一部分)
  • Hadoop 文件系统兼容性有限
  • 不进行路径规范化

6. 最佳实践

  • 为 S3 API 使用对象存储布局;为文件系统操作使用 FSO
  • 使用一致的前缀来组织键(例如 year/month/day/file.txt)

评论

登录后参与评论

正在加载评论…