快速开始

Ozone 中的读写操作

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

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

Apache Ozone 提供了多种用于读写数据的接口,以满足不同用例和客户端偏好的需求。本指南介绍如何在 Docker 环境中使用三种主要接口:

  1. Ozone Shell(ozone sh) —— 原生命令行接口
  2. ofs(Ozone 文件系统) —— 与 Hadoop 兼容的文件系统接口
  3. S3 API —— 与 Amazon S3 兼容的 REST 接口

以下所有示例均假设你已经按照 Docker 安装指南 中的说明,通过 Docker Compose 启动了一个正在运行的 Ozone 集群。

我们先启动 5 个 Datanode,因为下面的纠删码示例至少需要 5 个副本:


docker compose up -d --scale datanode=5

接口对比

接口优势适用场景
Ozone Shell- 可使用全部功能 进行高级操作 查看详细元数据- 管理任务 桶/卷管理 配额/ACL 管理
ofs- 熟悉的类 HDFS 命令 可与现有 Hadoop 应用配合使用 支持查看整个集群- Hadoop 生态系统集成 需要文件系统语义的应用
S3 API- 行业标准 可与现有 S3 客户端配合使用 与语言无关- Web 应用 多语言环境 现有 S3 应用

使用 Ozone Shell(ozone sh)

Ozone Shell 通过命令行接口提供对所有 Ozone 功能的直接访问。所有命令均遵循如下格式:


ozone sh <object-type> <action> <path> [options]

其中 <object-type> 可以是 volume、bucket 或 key。

访问 Ozone Shell

要在 Docker 环境中使用 Ozone Shell,请在 om 容器内执行命令:




docker compose exec om bash



使用卷

卷是 Ozone 中的顶级命名空间。




ozone sh volume create /vol1





ozone sh volume list /





ozone sh volume info /vol1





ozone sh volume delete /vol1







ozone sh volume delete -r /vol1

使用存储桶

首先,创建一个卷(如果 vol1 卷已存在,可跳过此步骤)


ozone sh volume create /vol1

桶是卷内键(对象)的容器。




ozone sh bucket create /vol1/bucket1





ozone sh bucket list /vol1





ozone sh bucket info /vol1/bucket1





ozone sh bucket delete /vol1/bucket1







ozone sh bucket delete -r /vol1/bucket1

使用密钥(对象)

首先,创建一个存储桶(如果存储桶 bucket1 已存在,则跳过此步骤)


ozone sh bucket create /vol1/bucket1

键(Key)是存储在 Ozone 中的实际数据对象。




echo "Hello Ozone via Shell" > test_shell.txt





ozone sh key put /vol1/bucket1/test_shell.txt test_shell.txt







ozone sh key put -t RATIS -r THREE /vol1/bucket1/key1_ratis test_shell.txt



ozone sh key put -t EC -r rs-3-2-1024k /vol1/bucket1/key1_ec test_shell.txt





ozone sh key get /vol1/bucket1/test_shell.txt ./downloaded_shell.txt





ozone sh key get --force /vol1/bucket1/test_shell.txt ./downloaded_shell.txt





ozone sh key info /vol1/bucket1/test_shell.txt





ozone sh key list /vol1/bucket1









ozone sh key rename /vol1/bucket1 test_shell.txt renamed_shell.txt





ozone sh key delete /vol1/bucket1/renamed_shell.txt





使用 ofs(Ozone 文件系统)

ofs 提供了兼容 Hadoop 的文件系统接口(ofs://),因此可以与为 HDFS 设计的应用程序无缝配合使用。

ofs 基本操作

ofs 使用标准的 Hadoop 文件系统命令。




ozone fs -mkdir -p ofs://om/vol1/bucketofs





echo "Hello from OFS" > local_ofs.txt

ozone fs -put local_ofs.txt ofs://om/vol1/bucketofs/





ozone fs -copyFromLocal local_ofs.txt ofs://om/vol1/bucketofs/remote_file.txt





ozone fs -ls ofs://om/vol1/bucketofs/





ozone fs -ls -R ofs://om/vol1/bucketofs/





ozone fs -get ofs://om/vol1/bucketofs/local_ofs.txt ./downloaded_ofs.txt





ozone fs -cat ofs://om/vol1/bucketofs/local_ofs.txt





ozone fs -mv ofs://om/vol1/bucketofs/local_ofs.txt ofs://om/vol1/bucketofs/moved_ofs.txt





ozone fs -cp ofs://om/vol1/bucketofs/moved_ofs.txt ofs://om/vol1/bucketofs/copy_ofs.txt





ozone fs -rm ofs://om/vol1/bucketofs/copy_ofs.txt





ozone fs -rm -skipTrash ofs://om/vol1/bucketofs/moved_ofs.txt





ozone fs -touchz ofs://om/vol1/bucketofs/empty_file.txt

ofs 高级操作




ozone fs -checksum ofs://om/vol1/bucketofs/empty_file.txt

使用 S3 API

S3 API 与为 Amazon S3 设计的应用程序保持兼容。它可通过 S3 Gateway 服务访问,在 Docker 环境中通常运行在 9878 端口上。

S3 凭据

在默认的非安全 Docker 环境中,凭据可以填写任意值。




export AWS_ACCESS_KEY_ID=testuser

export AWS_SECRET_ACCESS_KEY=testuser-secret

export AWS_ENDPOINT_URL=http://s3g:9878

(注意:设置 AWS_ENDPOINT_URL 可以简化下面的 aws 命令)

使用 AWS CLI

AWS CLI 可以在本地机器上使用(如果已安装),也可以在安装了它的容器内部使用。








aws s3api create-bucket --bucket=s3bucket





aws s3api list-buckets





echo "Hello S3" > s3_test.txt

aws s3 cp s3_test.txt s3://s3bucket/





aws s3 ls s3://s3bucket/





aws s3 cp s3://s3bucket/s3_test.txt ./downloaded_s3.txt





aws s3 rm s3://s3bucket/s3_test.txt





aws s3api delete-bucket --bucket=s3bucket

跨接口操作

Ozone 允许通过不同的接口访问相同的数据。

命名空间映射

| 数据位置 | Ozone Shell 路径 | ofs 路径 | S3 路径 |
| vol1/bucket1/file.txt | /vol1/bucket1/file.txt | ofs://<ozone service id>/vol1/bucket1/file.txt | s3://bucket1/file.txt(当 S3V 配置为服务 vol1 时) |
| s3v/s3bucket/file.txt | /s3v/s3bucket/file.txt | ofs://<ozone service id>/s3v/s3bucket/file.txt | s3://s3bucket/file.txt |

(注意:ofs:// 路径中的 om 指的是 Ozone Manager 服务地址)

通过 Ozone Shell/ofs 访问 S3 数据

通过 S3 创建的对象存放在特殊的 /s3v 卷中。

通过 Ozone Shell 访问(在 OM/客户端容器内)






docker compose exec om bash

ozone sh key list /s3v/s3bucket

ozone sh key get /s3v/s3bucket/s3_test.txt /tmp/from_s3.txt

exit

通过 ofs 访问(在 OM/客户端容器内)

在 /s3v 下创建一个 FSO 桶


ozone sh bucket create /s3v/fsobucket --layout fso

使用 AWS CLI 上传文件


aws s3 cp s3_test.txt s3://fsobucket/

通过 ofs 访问文件




ozone fs -ls ofs://om/s3v/fsobucket/



ozone fs -cat ofs://om/s3v/fsobucket/s3_test.txt

通过 S3 暴露非 S3 桶(桶链接)

你可以通过链接,使在 /s3v 之外创建的桶也能通过 S3 网关访问。




docker compose exec om bash





ozone sh volume create /myvol

ozone sh bucket create /myvol/mybucket





ozone sh bucket link /myvol/mybucket /s3v/linkedbucket

exit





aws s3 cp local_file.txt s3://linkedbucket/

aws s3 ls s3://linkedbucket/

桶布局(FSO 与 OBS)

Ozone 桶可以采用不同的内部布局:

  1. FILE_SYSTEM_OPTIMIZED (FSO): 默认布局。更适合层级化操作(如 ozone fs -mkdir),支持 ozone fs -rm 的回收站功能。推荐用于 Hadoop/文件系统工作负载。
  2. OBJECT_STORE (OBS): 传统布局。对于扁平的对象访问模式可能有轻微的性能优势。不支持回收站。
ozone sh bucket create /vol1/fsobucket --layout fso

ozone sh bucket create /vol1/obsbucket --layout obs

大多数操作在两种模式下都适用,但除非确实需要 OBS 的特定特性,一般更推荐使用 FSO。

总结

你已经学会了如何使用三种不同的接口——Ozone Shell、ofs 和 S3 API——在 Ozone 中执行基本的读写操作。每种接口各有优势,Ozone 的多协议设计让你可以在访问同一份底层数据的同时,选择最适合当前任务的工具。

评论

登录后参与评论

正在加载评论…