Ozone 中的读写操作
Apache Ozone 提供了多种用于读写数据的接口,以满足不同用例和客户端偏好的需求。本指南介绍如何在 Docker 环境中使用三种主要接口:
- Ozone Shell(
ozone sh) —— 原生命令行接口 - ofs(Ozone 文件系统) —— 与 Hadoop 兼容的文件系统接口
- 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.txtofs 高级操作
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 桶可以采用不同的内部布局:
- FILE_SYSTEM_OPTIMIZED (FSO): 默认布局。更适合层级化操作(如
ozone fs -mkdir),支持ozone fs -rm的回收站功能。推荐用于 Hadoop/文件系统工作负载。 - 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 的多协议设计让你可以在访问同一份底层数据的同时,选择最适合当前任务的工具。
评论
登录后参与评论
KnowForge