资讯动态

Ozone 0.5.0-beta 单机搭建实战:从零跑通对象存储全链路

发布时间:2026/10/15 1:14:25 来源:尧图企业网站定制
1. 为什么值得折腾 Ozone 这个冷门存储组件第一次接触 Ozone 是在一个离线数据归档的场景里当时集群里堆了快 800TB 的小文件NameNode 的堆内存天天告警运维群里一帮人轮流盯着 GC 日志。后来有人提了一句要不试试 Ozone才把这个组件拉进视野。Ozone 是 Hadoop 生态里专门为对象存储场景设计的分布式存储系统定位上跟 HDFS 是互补关系——HDFS 擅长处理大文件、高吞吐的顺序读写而 Ozone 把命名空间从单点 NameNode 里解放出来用 Ozone Manager 管元数据、Storage Container Manager 管块天然支持海量小文件和对象语义。这篇内容要聊的是 Ozone 0.5.0-beta 版本的单机搭建。为什么挑这个版本因为 0.5.0-beta 是 Ozone 从实验性组件走向可独立部署的一个分水岭它第一次把 S3 网关、Ozone Manager、Storage Container Manager 这几个核心角色拆得比较清楚单机跑起来之后能完整走通建卷—建桶—传对象—读对象的全链路。对于想摸清 Ozone 架构、又不想一上来就搭多节点集群的人来说单机模式是最省事的入口。适合看这篇的人大概有三类一是做大数据平台运维、被 NameNode 内存问题折磨过的工程师二是想了解对象存储底层实现、准备做技术选型的架构同学三是单纯想在自己笔记本或者一台闲置虚拟机上跑通 Ozone、看看它到底长什么样的技术爱好者。不管你是哪一类只要跟着走一遍最后都能拿到一个能用的单机 Ozone 环境并且理解每一步背后的取舍。需要提前说明的是0.5.0-beta 属于早期版本跟后来 1.x 的目录结构、配置项名称有不少差异网上很多教程是拿 1.x 的配置往 0.5.0 上套结果启动就报错。这篇会严格按 0.5.0-beta 的实际行为来写同时把那些版本坑标出来省得你踩。2. 搭建前的整体设计与环境规划2.1 单机模式到底单在哪里很多人以为单机模式就是把多节点集群的所有角色塞到一台机器上其实 Ozone 的单机部署有两种理解方式。一种是伪分布式即 OM、SCM、Datanode 各自独立进程跑在同一台机器上通过本地回环通信另一种是MiniOzoneCluster那是测试代码里用的进程内嵌不适合手工操作。这篇讲的是前者也就是伪分布式单机。为什么选伪分布式而不是真单进程因为 Ozone 的架构里OM 和 SCM 是强依赖关系Datanode 又要向 SCM 注册、向 OM 汇报如果全塞进一个 JVM很多网络交互的细节就被屏蔽了你根本看不到谁先启动、谁等谁这些关键顺序。伪分布式虽然麻烦一点但能让你把启动依赖链摸清楚后面上多节点时心里有底。单机模式下所有角色共享同一份配置文件目录但每个角色读的配置项不同。OM 关心ozone.om.addressSCM 关心ozone.scm.addressDatanode 关心ozone.scm.names和自身的数据目录。这些地址在单机里统一写成localhost或者127.0.0.1端口要错开避免跟机器上已有的服务撞车。2.2 版本选型与依赖梳理0.5.0-beta 对 JDK 的要求是 JDK 8JDK 11 在那个年代还没被完全支持实测用 JDK 11 启动 SCM 时会报NoClassDefFoundError原因是它依赖的一些反射调用在 JDK 11 里被模块系统拦了。所以第一件事就是把 JAVA_HOME 指到 JDK 8别偷懒。Hadoop 主版本方面Ozone 0.5.0-beta 是跟着 Hadoop 3.2.0 一起发布的它的二进制包既可以单独下载hadoop-ozone-0.5.0-beta也可以直接用 Hadoop 3.2.0 完整包里的share/hadoop/ozone目录。我建议直接下 Ozone 的独立发行包体积小、目录干净不用在一堆 Hadoop 组件里翻。依赖上Ozone 自己带了 OM、SCM、Datanode、S3G 四个可执行入口不需要额外装 HDFS。但有个隐藏依赖它内部用到了libhadoop的一些 native 库来做校验和计算如果机器上缺libcrypto或者zlib的开发库启动时会警告native library not loaded虽然不致命但校验和会退化成 Java 实现性能差一截。所以顺手把openssl-devel和zlib-devel装上能省掉后面很多莫名其妙的慢。2.3 目录结构与数据落盘规划单机搭建最容易忽略的是目录规划。Ozone 有三类数据要落盘OM 的元数据RocksDB、SCM 的元数据也是 RocksDB、Datanode 的块数据。默认配置会把它们全塞到/tmp下面机器一重启就没了而且/tmp通常挂载在根分区数据量一大就把系统盘撑爆。我的做法是在数据盘上建一个统一根目录比如/data/ozone下面分om、scm、dn三个子目录分别对应三个角色的数据。然后在配置里显式指定ozone.om.db.dirs、ozone.scm.db.dirs、ozone.datanode.data.dir指向这些路径。这样做的好处是数据集中、备份方便而且哪天要清环境直接rm -rf /data/ozone就行不会误删系统文件。还有一点Datanode 的数据目录最好单独挂一块盘或者至少跟 OM/SCM 的元数据目录分开。因为 Datanode 写块是顺序大 IOOM/SCM 写 RocksDB 是随机小 IO混在一起会互相干扰。单机测试无所谓但如果打算长期跑这个隔离能明显改善稳定性。3. 核心组件与配置项逐个拆解3.1 Ozone Manager命名空间的大脑OM 在 Ozone 里的角色相当于 HDFS 的 NameNode但它管的是卷Volume、桶Bucket、键Key这三级命名空间不直接管块。0.5.0-beta 的 OM 启动时会做几件事初始化 RocksDB、加载ozone-site.xml、向 SCM 申请一个 SCM block 用于存放自己的元数据快照、然后监听 RPC 端口。关键配置项有这么几个。ozone.om.address是 OM 对外提供服务的地址单机写localhost端口默认 9862。ozone.om.http-address是它的 Web UI 和 REST 端口默认 9874启动后可以浏览器打开看卷和桶的列表。ozone.om.db.dirs前面说过指向/data/ozone/om。还有一个容易漏的ozone.om.ratis.enable单机模式下要设成false否则它会尝试起 Ratis 复制组单节点起不来。OM 启动慢是常态因为它要等 SCM 先就绪。实测下来SCM 起来之后 OM 还要等 10 到 20 秒才能完成初始化这期间日志里会反复打 Waiting for SCM to be ready。别急着 kill等它自己过去就行。3.2 Storage Container Manager块的调度中心SCM 是 Ozone 里比较独特的设计它管的是 container容器一个 container 里装很多块块再组成键的数据。SCM 负责 container 的分配、复制、平衡相当于把 HDFS 里 NameNode 的块管理职责单独拆了出来。配置上ozone.scm.address是 SCM 的 RPC 地址默认端口 9860。ozone.scm.http-address是 Web 端口默认 9876。ozone.scm.db.dirs指向/data/ozone/scm。还有一个ozone.scm.datanode.id和ozone.scm.datanode.id.dir这是 SCM 给每个 Datanode 分配的唯一 ID 存放位置单机下指向/data/ozone/scm/datanode.id即可。SCM 启动时会先初始化自己的 RocksDB然后监听 Datanode 的注册请求。如果 Datanode 先于 SCM 启动Datanode 会不断重试注册日志里刷 Retrying to connect to SCM这是正常现象等 SCM 起来就好了。但反过来如果 SCM 起来了迟迟没有 Datanode 注册那就要检查ozone.scm.names配置对不对。3.3 Datanode真正存数据的地方Datanode 在 Ozone 里跟 HDFS 的 Datanode 名字一样但职责不同。它不再向 NameNode 汇报块而是向 SCM 注册、领取 container然后在 container 里读写块。配置项ozone.datanode.data.dir指向/data/ozone/dnozone.scm.names填 SCM 的地址单机就是localhost。Datanode 有个坑0.5.0-beta 默认的 container 大小是 5GB如果单机磁盘小跑一会儿就满了。可以在ozone-site.xml里把ozone.scm.container.size调小比如 1GB方便测试。另外ozone.datanode.container.db.dir是 Datanode 自己记录 container 元数据的 RocksDB 目录也要指到数据盘上。3.4 S3 Gateway让对象存储说人话S3G 是可选组件但它让 Ozone 的价值一下子放大了——你可以用任何支持 S3 协议的客户端aws cli、s3cmd、boto3直接读写 Ozone不用学它原生的ozone sh命令。0.5.0-beta 的 S3G 配置项是ozone.s3g.address默认端口 9878ozone.s3g.http-address是它的 HTTP 端口。S3G 启动依赖 OMOM 没起来它起不来。而且它需要配置ozone.s3g.secret.key和ozone.s3g.access.key这是 S3 的凭证单机随便设一个字符串就行但必须设否则启动报 Secret key not configured。4. 从零开始的完整实操流程4.1 环境准备与依赖安装先确认 JDK 版本。执行java -version输出必须是1.8.0_xxx。如果是 11 或 17先装 JDK 8 并改JAVA_HOME。然后装 native 依赖CentOS 系用yum install -y openssl-devel zlib-develDebian 系用apt install -y libssl-dev zlib1g-dev。接着建目录mkdir -p /data/ozone/{om,scm,dn,s3g} chmod -R 755 /data/ozone下载 Ozone 0.5.0-beta 发行包解压到/opt/ozone。设置环境变量export OZONE_HOME/opt/ozone export PATH$PATH:$OZONE_HOME/bin export JAVA_HOME/usr/lib/jvm/java-8-openjdk把这几行写进/etc/profile.d/ozone.sh后面开新终端不用重复设。4.2 配置文件逐项填写Ozone 的配置文件在$OZONE_HOME/etc/hadoop/下核心是ozone-site.xml。0.5.0-beta 的配置项命名跟 1.x 不同下面这份是实测能跑通的configuration property nameozone.om.address/name valuelocalhost/value /property property nameozone.om.http-address/name valuelocalhost:9874/value /property property nameozone.om.db.dirs/name value/data/ozone/om/value /property property nameozone.om.ratis.enable/name valuefalse/value /property property nameozone.scm.address/name valuelocalhost/value /property property nameozone.scm.http-address/name valuelocalhost:9876/value /property property nameozone.scm.db.dirs/name value/data/ozone/scm/value /property property nameozone.scm.datanode.id.dir/name value/data/ozone/scm/datanode.id/value /property property nameozone.scm.container.size/name value1GB/value /property property nameozone.datanode.data.dir/name value/data/ozone/dn/value /property property nameozone.datanode.container.db.dir/name value/data/ozone/dn/db/value /property property nameozone.scm.names/name valuelocalhost/value /property property nameozone.s3g.address/name valuelocalhost/value /property property nameozone.s3g.http-address/name valuelocalhost:9878/value /property property nameozone.s3g.access.key/name valueozoneaccess/value /property property nameozone.s3g.secret.key/name valueozonesecret/value /property /configuration注意ozone.om.ratis.enable必须显式设为 false0.5.0-beta 的默认值在某些发行包里是 true不关掉单机起不来。4.3 启动顺序与验证启动顺序是 SCM → OM → Datanode → S3G这个顺序不能乱。SCM 是基础OM 要向它注册Datanode 要向它注册S3G 依赖 OM。启动 SCMozone scm --daemonize等 5 秒看日志$OZONE_HOME/logs/ozone-scm-*.log出现 SCM started 再继续。启动 OMozone om --daemonizeOM 启动会等 SCM日志里看到 OM started 才算好。然后启动 Datanodeozone datanode --daemonize最后启动 S3Gozone s3g --daemonize验证的话先看进程jps应该能看到StorageContainerManager、OzoneManager、HddsDatanode、S3Gateway四个进程。然后打开浏览器访问http://localhost:9874看 OM 的 Web UI能看到卷列表就说明 OM 正常。再访问http://localhost:9876看 SCM 的 UI能看到 Datanode 注册信息就说明 SCM 和 Datanode 通了。4.4 建卷、建桶、传对象全链路验证用ozone sh命令走一遍ozone sh volume create /testvol ozone sh bucket create /testvol/testbucket echo hello ozone /tmp/testfile.txt ozone sh key put /testvol/testbucket/testkey /tmp/testfile.txt ozone sh key get /testvol/testbucket/testkey /tmp/out.txt cat /tmp/out.txt如果最后输出hello ozone说明整条链路通了。再用 S3 接口验证aws s3api --endpoint-url http://localhost:9878 \ --access-key ozoneaccess --secret-key ozonesecret \ list-buckets能列出testbucket就说明 S3G 也正常。5. 常见问题与排查技巧实录5.1 启动失败类问题速查现象可能原因排查方法SCM 启动后立即退出JDK 版本不对检查java -version是否为 1.8OM 一直卡在 Waiting for SCMSCM 没起来或端口不通netstat -tlnpDatanode 反复重连 SCMozone.scm.names配错确认配置值是localhost而非主机名S3G 启动报 Secret key not configured凭证没配检查ozone.s3g.secret.key是否填写所有进程都起但 Web UI 打不开防火墙拦截iptables -L看 9874/9876 是否放行5.2 那些文档里不会写的坑第一个坑是主机名解析。0.5.0-beta 的 SCM 在注册 Datanode 时会用InetAddress.getLocalHost().getHostName()拿主机名如果/etc/hosts里没把主机名映射到 127.0.0.1Datanode 注册会超时。解决办法是在/etc/hosts加一行127.0.0.1 $(hostname)。第二个坑是 RocksDB 的 native 库。OM 和 SCM 都用 RocksDB 存元数据0.5.0-beta 自带的 RocksDB native 库在某些 glibc 版本上会报UnsatisfiedLinkError。如果遇到把$OZONE_HOME/lib/native加到LD_LIBRARY_PATH里或者干脆用纯 Java 模式在配置里加ozone.om.db.rocksdb.jnifalse性能差一点但能跑。第三个坑是磁盘空间。Datanode 默认会预分配 container 文件一个 container 1GB启动时就会占掉。如果/data分区小于 5GB跑一会儿就 No space left on device。单机测试建议把ozone.scm.container.size调到 256MB。5.3 性能与稳定性调优建议单机环境下OM 和 SCM 的 JVM 堆不用给太大各 1GB 足够但 Datanode 的堆可以给到 2GB因为它要处理块读写。在ozone-env.sh里设OZONE_OM_OPTS-Xmx1g、OZONE_SCM_OPTS-Xmx1g、OZONE_DATANODE_OPTS-Xmx2g。另外0.5.0-beta 的 S3G 默认线程池很小并发上传时会排队。可以在ozone-site.xml里加ozone.s3g.thread.pool.size设成 50实测并发上传能快一倍。6. 单机环境的价值边界与后续扩展单机跑通之后你会对 Ozone 的启动依赖、配置项含义、数据落盘位置有一个具体的感知这比看十篇架构文档都管用。但它毕竟只是单机很多 Ozone 的核心能力——比如 container 的复制、SCM 的负载均衡、OM 的 HA——在单机下是看不到的。如果后面想往多节点走第一步是把ozone.scm.names从localhost改成 SCM 节点的真实地址然后在每个 Datanode 节点上重复 Datanode 的配置。OM 的 HA 要配 Ratis那是另一个话题了0.5.0-beta 的 Ratis 还不太稳定建议直接上 1.x 再做 HA。我个人在实际操作中的体会是Ozone 这个组件最值得花时间的地方不是怎么装而是为什么这么设计。比如为什么要把块管理从 NameNode 拆出来、为什么用 container 而不是直接管块、S3G 在中间扮演什么角色。把单机环境搭起来然后带着这些问题去看日志、看 Web UI、看数据目录比干读源码效率高得多。最后再分享一个小技巧OM 的 Web UI 里有个 Debug 页面能看到当前所有卷、桶、键的元数据快照排查命名空间问题时特别有用很多人不知道这个入口。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑