客户端接口

ofs

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

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

Hadoop 兼容文件系统接口使得像 Ozone 这样的存储后端可以轻松集成到 Hadoop 生态系统中。Ozone 文件系统就是一个 Hadoop 兼容的文件系统。

warning

目前,Ozone 支持两种 scheme:o3fs:// 和 ofs://。

o3fs 与 ofs 最大的区别在于:o3fs 只支持在**单个存储桶(bucket)**上进行操作,而 ofs 支持跨所有存储卷(volume)和存储桶进行操作,并提供所有存储卷/存储桶的完整视图。

基础知识

合法的 ofs 路径示例:

ofs://om1/
ofs://om3:9862/
ofs://omservice/
ofs://omservice/volume1/
ofs://omservice/volume1/bucket1/
ofs://omservice/volume1/bucket1/dir1
ofs://omservice/volume1/bucket1/dir1/key1

ofs://omservice/tmp/
ofs://omservice/tmp/key1

卷和挂载点位于 ofs 文件系统的根层级。桶自然地列在卷之下。键和目录位于每个桶之下。

请注意,目前挂载仅支持临时挂载 /tmp。

配置

请在 core-site.xml 中添加以下配置项。

<property>
  <name>fs.ofs.impl</name>
  <value>org.apache.hadoop.fs.ozone.RootedOzoneFileSystem</value>
</property>
<property>
  <name>fs.defaultFS</name>
  <value>ofs://om-host.example.com/</value>
</property>

这将把所有卷和桶作为默认的 Hadoop 兼容文件系统,并注册 ofs 文件系统类型。

你还需要将 Ozone 文件系统的 JAR 文件添加到类路径中:

export HADOOP_CLASSPATH=/opt/ozone/share/ozone/lib/ozone-filesystem-hadoop3-*.jar:$HADOOP_CLASSPATH

注意

使用 Hadoop 2.x 时,请使用对应 Hadoop 2.x 的版本。

设置好默认文件系统后,用户即可运行 ls、put、mkdir 等命令。例如:

hdfs dfs -ls /

注意,ofs 适用于所有存储桶和卷。用户可以使用 mkdir 创建存储桶和卷,例如创建名为 volume1 的卷和名为 bucket1 的存储桶:

hdfs dfs -mkdir /volume1
hdfs dfs -mkdir /volume1/bucket1

也可以使用 put 命令将文件写入存储桶。

hdfs dfs -put /etc/hosts /volume1/bucket1/test

有关更多用法,请参阅:https://issues.apache.org/jira/secure/attachment/12987636/Design%20ofs%20v1.pdf

与 o3fs 的区别

创建文件

ofs 不允许直接在根目录或卷下创建键(文件)。用户尝试这样做时会收到错误消息:

ozone fs -touch /volume1/key1
# Output: touch: Cannot create file under root or volume.

简化 fs.defaultFS

使用 ofs 后,core-site.xml 中的 fs.defaultFS 不再像 o3fs 那样需要在路径中指定具体的卷和桶,只需填写 OM 主机名或服务 ID(在 HA 场景下)即可:

<property>
  <name>fs.defaultFS</name>
  <value>ofs://omservice</value>
</property>

这样,客户端就可以访问集群上的所有卷和存储桶,而无需指定主机名或服务 ID。

ozone fs -mkdir -p /volume1/bucket1

直接在 FileSystem shell 中管理卷和桶

管理员可以使用 Hadoop FS shell 轻松创建和删除卷与桶。卷和桶的处理方式与目录类似,因此使用 -p 参数时,若它们不存在将会被自动创建:

ozone fs -mkdir -p ofs://omservice/volume1/bucket1/dir1/

请注意,受支持的卷名与桶名字符集规则仍然适用。例如,桶名和卷名不能包含下划线(_):

$ ozone fs -mkdir -p /volume_1
mkdir: Bucket or Volume name has an unsupported character : _

挂载与 /tmp 的配置

为了兼容使用 /tmp/ 的旧版 Hadoop 应用程序,我们在文件系统的根目录下提供了一个特殊的临时挂载点。此功能将来可能会扩展,以支持自定义挂载路径。

目前 Ozone 支持两种 /tmp 的配置方式。第一种(默认)是为每个用户创建一个临时目录,由一个挂载卷和一个属于该用户的专用临时桶组成。第二种(可通过 ozone-site.xml 配置)是一个对所有用户通用的、类似粘滞位(sticky-bit)的临时目录,由一个挂载卷和一个公共临时桶组成。

重要提示:要使用它,首先需要由管理员创建 tmp 卷(目前卷名是硬编码的),并将其 ACL 设置为所有人拥有 ALL 访问权限。即:

ozone sh volume create tmp
ozone sh volume setacl tmp -al world::a

这些命令每个集群只需执行一次。

每个用户的 /tmp 目录(默认)

然后,每个用户都需要先执行 mkdir,为自己的临时存储桶完成一次初始化。

$ ozone fs -mkdir /tmp
2020-06-04 00:00:00,050 [main] INFO rpc.RpcClient: Creating Bucket: tmp/0238 ...

之后,他们就可以像写入普通目录一样向其中写入数据。例如:

ozone fs -touch /tmp/key1

创建对所有用户共享的 /tmp 目录

若要启用带粘滞位的公共 /tmp 目录,请在 ozone-site.xml 中添加以下配置属性

<property>
  <name>ozone.om.enable.ofs.shared.tmp.dir</name>
  <value>true</value>
</property>

随后以 admin 身份设置好 tmp 卷之后,再配置一个 tmp 存储桶,作为所有用户共用的 /tmp 目录,例如:

$ ozone sh bucket create /tmp/tmp
$ ozone sh volume setacl tmp -a user:anyuser:rwlc \
  user:adminuser:a,group:anyuser:rwlc,group:adminuser:a tmp/tmp

其中,anyuser 是管理员希望授权访问的用户名,adminuser 是管理员的用户名。

随后,用户通过以下方式访问 tmp 目录:

ozone fs -put ./NOTICE.txt ofs://om/tmp/key1

启用回收站的删除操作

要在 Ozone 中启用回收站,请将以下配置添加到 core-site.xml

<property>
  <name>fs.trash.interval</name>
  <value>10</value>
</property>
<property>
  <name>fs.trash.classname</name>
  <value>org.apache.hadoop.fs.ozone.OzoneTrashPolicy</value>
</property>

启用回收站后,删除键时,键会被移动到各个桶下的回收站目录中,因为在 Ozone 中不允许在桶之间移动(重命名)键。

$ ozone fs -rm /volume1/bucket1/key1
2020-06-04 00:00:00,100 [main] INFO fs.TrashPolicyDefault: Moved: 'ofs://id1/volume1/bucket1/key1' to trash at: ofs://id1/volume1/bucket1/.Trash/hadoop/Current/volume1/bucket1/key1

这与 HDFS 加密区处理回收站位置的方式非常相似。

注意

  1. 使用 -skipTrash 标志可以永久删除文件,而不会将其移入回收站。
  2. 在启用回收站的情况下,不允许在存储桶或存储卷级别执行删除操作。在这种情况下必须使用 skipTrash,即 ozone fs -rm -R ofs://vol1/bucket1 或 ozone fs -rm -R o3fs://bucket1.vol1 在不使用 skipTrash 的情况下是不被允许的。

递归列出

ofs 支持递归列出存储卷、存储桶和对象。

即如果启用了 ACL,ozone fs -ls -R ofs://omservice/ 将递归列出用户拥有 LIST 权限的所有存储卷、存储桶和对象。如果禁用了 ACL,该命令将列出该集群上的所有内容。

此功能不会降低服务器性能,因为循环是在客户端进行的。可以将其理解为客户端向服务器发出多个请求以获取所有信息。

从 HDFS 迁移

本指南通过详细说明 Ozone 文件系统(ofs)的 API 级别兼容性,帮助你将应用程序从 HDFS 迁移到 Ozone。

为确保顺利过渡,你应首先验证现有应用程序能否与 ofs 一同工作。通过确定你的应用程序所使用的 HDFS API,你可以检查是否存在潜在的不兼容问题。

  • 对于集群管理员:分析源 HDFS 集群上的 NameNode 审计日志,以确定你的应用程序执行了哪些操作。
  • 对于应用程序开发人员:查看应用程序的源代码,以确定调用了哪些 FileSystem 或 DistributedFileSystem API。

获得 API 列表后,将其与下表进行比较,以识别任何不受支持的操作。

受支持的 FileSystem API

ofs 支持以下标准 FileSystem API。

操作NameNode 审计日志描述支持情况
accesscheckAccess检查用户是否有权访问某个路径。已支持
createcreate创建新文件。已支持
openopen打开文件以进行读取。已支持
renamerename重命名文件或目录。已支持 [1]
deletedelete删除文件或目录。已支持 [2]
listStatuslistStatus列出目录中文件的状态。已支持 [3]
mkdirsmkdirs创建目录及其所有父目录。已支持
getFileStatusgetfileinfo获取文件的状态。已支持
setTimessetTimes设置修改时间和访问时间。已支持
getLinkTargetgetfileinfo获取符号链接的目标。已支持 [4]
getFileChecksumopen获取文件的校验和。已支持
setSafeModesafemode_leave, safemode_enter, safemode_get, safemode_force_exit进入或退出安全模式。已支持
recoverLeaserecoverLease恢复文件租约。已支持
isFileClosedisFileClosed检查文件是否已关闭。已支持
createSnapshotcreateSnapshot创建快照。已支持 [5]
deleteSnapshotdeleteSnapshot删除快照。已支持 [5]
renameSnapshotrenameSnapshot重命名快照。已支持 [5]
getSnapshotDiffReportcomputeSnapshotDiff获取快照差异报告。已支持 [5]
getContentSummarycontentSummary获取路径的内容摘要。已支持
getDelegationTokengetDelegationToken获取委托令牌。已支持
globStatuslistStatus查找匹配模式的文件。已支持
copyFromLocalFilegetfileinfo从本地文件系统复制文件。已支持
existsgetfileinfo检查路径是否存在。已支持
getFileBlockLocationsopen获取文件块的位置。已支持
getTrashRootlistSnapshottableDirectory, getEZForPath获取路径的回收站根目录。已支持
getTrashRootslistStatus, listEncryptionZones获取所有回收站根目录。已支持
isDirectorygetfileinfo检查路径是否为目录。已支持
isFilegetfileinfo检查路径是否为文件。已支持
listFileslistStatus返回文件的远程迭代器。已支持
listLocatedStatuslistStatus返回带位置信息的文件状态远程迭代器。已支持
listStatusIteratorlistStatus返回文件状态的远程迭代器。已支持
getDefaultBlockSizeN/A获取默认块大小。已支持
getDefaultReplicationN/A获取默认副本因子。已支持
getHomeDirectoryN/A获取用户的主目录。已支持
getServerDefaultsN/A获取服务器的默认值。已支持
getWorkingDirectoryN/A获取当前工作目录。已支持
hasPathCapabilityN/A查询路径能力。已支持
setWorkingDirectoryN/A设置当前工作目录。已支持
supportsSymlinksN/A检查是否支持符号链接。已支持

注意:审计日志为 N/A 表示该 API 仅在客户端执行,不会访问 NameNode。

不支持的 FileSystem API

以下标准 FileSystem API 不受 ofs 支持。

操作NameNode 审计日志说明
appendappend向现有文件追加内容。
setPermissionsetPermission设置文件的权限。
setOwnersetOwner设置文件的所有者。
setReplicationsetReplication设置副本因子。
createSymlinkcreateSymlink创建符号链接。
resolveLinkgetfileinfo解析符号链接。
setXAttrsetXAttr设置扩展属性。
getXAttrgetXAttrs获取扩展属性。
getXAttrsgetXAttrs获取多个扩展属性。
listXAttrslistXAttrs列出扩展属性。
removeXAttrremoveXAttr移除扩展属性。
setAclsetAcl设置 ACL。
getAclStatusgetAclStatus获取 ACL 状态。
modifyAclEntriesmodifyAclEntries修改 ACL 条目。
removeAclEntriesremoveAclEntries移除 ACL 条目。
removeDefaultAclremoveDefaultAcl移除默认 ACL。
removeAclremoveAcl移除 ACL。
truncatetruncate截断文件。
concatconcat拼接文件。
listCorruptFileBlockslistCorruptFileBlocks列出损坏的文件块
msyncN/A没有对应的 HDFS 审计日志。

不支持的 HDFS 特有 API

以下 API 是 HDFS DistributedFileSystem 实现所特有的,并不属于通用的 org.apache.hadoop.fs.FileSystem API,因此不受 ofs 支持。不过,可参见下方脚注了解等效的 API。

OperationNameNode audit logDescriptionSupport
getErasureCodingPolicygetErasureCodingPolicy获取文件/目录的纠删码策略。不支持 [6]
setErasureCodingPolicysetErasureCodingPolicy在目录上设置纠删码策略。不支持 [6]
unsetErasureCodingPolicyunsetErasureCodingPolicy取消目录上的纠删码策略。不支持 [6]
addErasureCodingPoliciesaddErasureCodingPolicies添加纠删码策略。不支持 [6]
getErasureCodingPoliciesgetErasureCodingPolicies获取可用的纠删码策略。不支持 [6]
removeErasureCodingPolicyremoveErasureCodingPolicy移除纠删码策略。不支持 [6]
enableErasureCodingPolicyenableErasureCodingPolicy启用纠删码策略。不支持 [6]
disableErasureCodingPolicydisableErasureCodingPolicy禁用纠删码策略。不支持 [6]
getErasureCodingCodecsgetErasureCodingCodecs列出所有纠删码编解码器。不支持 [6]
getECTopologyResultForPoliciesgetECTopologyResultForPolicies获取策略的纠删码拓扑结果。不支持 [6]
getSnapshotListingListSnapshot列出可快照目录的所有快照。不支持 [6]
allowSnapshotallowSnapshot允许对目录进行快照。不支持 [6]
disallowSnapshotdisallowSnapshot禁止对目录进行快照。不支持 [6]
provisionSnapshotTrashgetfileinfo, mkdirs, setPermission为可快照目录预配回收站。不支持 [6]
createEncryptionZonecreateEncryptionZone创建加密区。不支持 [6]
getEZForPathgetEZForPath获取路径所属的加密区。不支持 [6]
listEncryptionZoneslistEncryptionZones列出所有加密区。不支持 [6]
reencryptEncryptionZonereencryptEncryptionZone重新加密加密区。不支持 [6]
listReencryptionStatuslistReencryptionStatus列出重新加密状态。不支持 [6]
getFileEncryptionInfogetfileinfo获取文件加密信息。不支持 [6]
provisionEZTrashgetEZForPath, getfileinfo, mkdirs, setPermission为加密区预配回收站。不支持 [6]
setQuotaclearQuota 或 clearSpaceQuota 或 setQuota 或 setSpaceQuota设置路径的配额使用量。不支持 [6]
getQuotaUsagequotaUsage获取路径的配额使用量。不支持 [6]
setQuotaByStorageTypesetSpaceQuota按存储类型设置路径的配额。不支持 [6]
unsetStoragePolicyunsetStoragePolicy取消文件或目录上的存储策略。不支持
setStoragePolicysetStoragePolicy在文件或目录上设置存储策略。不支持
getStoragePolicygetStoragePolicy获取文件或目录的存储策略。不支持
satisfyStoragePolicysatisfyStoragePolicy使文件满足存储策略。不支持
addCachePooladdCachePool添加缓存池。不支持
modifyCachePoolmodifyCachePool修改缓存池。不支持
removeCachePoolremoveCachePool移除缓存池。不支持
listCachePoolslistCachePools列出所有缓存池。不支持
addCacheDirectiveaddCacheDirective添加缓存指令。不支持
modifyCacheDirectivemodifyCacheDirective修改缓存指令。不支持
removeCacheDirectiveremoveCacheDirective移除缓存指令。不支持
listCacheDirectiveslistCacheDirectives列出缓存指令。不支持
getSlowDatanodeStatsdatanodeReport获取慢速 DataNode 统计信息。不支持
saveNamespacesaveNamespace保存命名空间。不支持
restoreFailedStoragecheckRestoreFailedStorage, enableRestoreFailedStorage, disableRestoreFailedStorage恢复故障存储。不支持
refreshNodesrefreshNodes刷新节点。不支持
setBalancerBandwidthsetBalancerBandwidth设置均衡器带宽。不支持
metaSavemetaSave元数据保存。不支持
rollingUpgradequeryRollingUpgrade, startRollingUpgrade, finalizeRollingUpgrade滚动升级。不支持

| finalizeUpgrade | finalizeUpgrade | 完成升级。 | 不支持

脚注:

[1]

不支持跨不同桶重命名文件或目录。在文件系统优化(FSO)桶中,重命名是一个原子元数据操作。对于传统桶,重命名目录是一个非原子操作,会逐个重命名每个文件和子目录。

[2]

不允许删除文件系统根目录。也不支持递归删除卷。

[3]

不支持在根目录或卷级别进行递归列出。

[4]

ofs 支持“链接桶”,即一个桶作为另一个桶的引用。但不支持针对文件或目录的通用符号链接。

[5]

仅在桶级别支持快照。

[6]

对于与加密区域、纠删码、快照和配额相关的操作,请改用相应的 Ozone 桶级 API。

[7]

替换为 OzoneManagerProtocol.finalizeUpgrade() 和 OzoneManagerProtocol.listOpenFiles()。

以下审计日志通常由 HDFS 内部服务产生,与应用迁移无关:slowDataNodesReport、getDatanodeStorageReport、rollEditLog、renewDelegationToken、cancelDelegationToken、gcDeletedSnapshot。

以下审计日志由 HDFS 输出流产生:getAdditionalBlock、getAdditionalDatanode、abandonBlock、completeFile、fsync。

getPreferredBlockSize 审计日志仅用于测试。

评论

登录后参与评论

正在加载评论…