ofs
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 加密区处理回收站位置的方式非常相似。
注意
- 使用
-skipTrash标志可以永久删除文件,而不会将其移入回收站。 - 在启用回收站的情况下,不允许在存储桶或存储卷级别执行删除操作。在这种情况下必须使用 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或DistributedFileSystemAPI。
获得 API 列表后,将其与下表进行比较,以识别任何不受支持的操作。
受支持的 FileSystem API
ofs 支持以下标准 FileSystem API。
| 操作 | NameNode 审计日志 | 描述 | 支持情况 |
|---|---|---|---|
access | checkAccess | 检查用户是否有权访问某个路径。 | 已支持 |
create | create | 创建新文件。 | 已支持 |
open | open | 打开文件以进行读取。 | 已支持 |
rename | rename | 重命名文件或目录。 | 已支持 [1] |
delete | delete | 删除文件或目录。 | 已支持 [2] |
listStatus | listStatus | 列出目录中文件的状态。 | 已支持 [3] |
mkdirs | mkdirs | 创建目录及其所有父目录。 | 已支持 |
getFileStatus | getfileinfo | 获取文件的状态。 | 已支持 |
setTimes | setTimes | 设置修改时间和访问时间。 | 已支持 |
getLinkTarget | getfileinfo | 获取符号链接的目标。 | 已支持 [4] |
getFileChecksum | open | 获取文件的校验和。 | 已支持 |
setSafeMode | safemode_leave, safemode_enter, safemode_get, safemode_force_exit | 进入或退出安全模式。 | 已支持 |
recoverLease | recoverLease | 恢复文件租约。 | 已支持 |
isFileClosed | isFileClosed | 检查文件是否已关闭。 | 已支持 |
createSnapshot | createSnapshot | 创建快照。 | 已支持 [5] |
deleteSnapshot | deleteSnapshot | 删除快照。 | 已支持 [5] |
renameSnapshot | renameSnapshot | 重命名快照。 | 已支持 [5] |
getSnapshotDiffReport | computeSnapshotDiff | 获取快照差异报告。 | 已支持 [5] |
getContentSummary | contentSummary | 获取路径的内容摘要。 | 已支持 |
getDelegationToken | getDelegationToken | 获取委托令牌。 | 已支持 |
globStatus | listStatus | 查找匹配模式的文件。 | 已支持 |
copyFromLocalFile | getfileinfo | 从本地文件系统复制文件。 | 已支持 |
exists | getfileinfo | 检查路径是否存在。 | 已支持 |
getFileBlockLocations | open | 获取文件块的位置。 | 已支持 |
getTrashRoot | listSnapshottableDirectory, getEZForPath | 获取路径的回收站根目录。 | 已支持 |
getTrashRoots | listStatus, listEncryptionZones | 获取所有回收站根目录。 | 已支持 |
isDirectory | getfileinfo | 检查路径是否为目录。 | 已支持 |
isFile | getfileinfo | 检查路径是否为文件。 | 已支持 |
listFiles | listStatus | 返回文件的远程迭代器。 | 已支持 |
listLocatedStatus | listStatus | 返回带位置信息的文件状态远程迭代器。 | 已支持 |
listStatusIterator | listStatus | 返回文件状态的远程迭代器。 | 已支持 |
getDefaultBlockSize | N/A | 获取默认块大小。 | 已支持 |
getDefaultReplication | N/A | 获取默认副本因子。 | 已支持 |
getHomeDirectory | N/A | 获取用户的主目录。 | 已支持 |
getServerDefaults | N/A | 获取服务器的默认值。 | 已支持 |
getWorkingDirectory | N/A | 获取当前工作目录。 | 已支持 |
hasPathCapability | N/A | 查询路径能力。 | 已支持 |
setWorkingDirectory | N/A | 设置当前工作目录。 | 已支持 |
supportsSymlinks | N/A | 检查是否支持符号链接。 | 已支持 |
注意:审计日志为 N/A 表示该 API 仅在客户端执行,不会访问 NameNode。
不支持的 FileSystem API
以下标准 FileSystem API 不受 ofs 支持。
| 操作 | NameNode 审计日志 | 说明 |
|---|---|---|
append | append | 向现有文件追加内容。 |
setPermission | setPermission | 设置文件的权限。 |
setOwner | setOwner | 设置文件的所有者。 |
setReplication | setReplication | 设置副本因子。 |
createSymlink | createSymlink | 创建符号链接。 |
resolveLink | getfileinfo | 解析符号链接。 |
setXAttr | setXAttr | 设置扩展属性。 |
getXAttr | getXAttrs | 获取扩展属性。 |
getXAttrs | getXAttrs | 获取多个扩展属性。 |
listXAttrs | listXAttrs | 列出扩展属性。 |
removeXAttr | removeXAttr | 移除扩展属性。 |
setAcl | setAcl | 设置 ACL。 |
getAclStatus | getAclStatus | 获取 ACL 状态。 |
modifyAclEntries | modifyAclEntries | 修改 ACL 条目。 |
removeAclEntries | removeAclEntries | 移除 ACL 条目。 |
removeDefaultAcl | removeDefaultAcl | 移除默认 ACL。 |
removeAcl | removeAcl | 移除 ACL。 |
truncate | truncate | 截断文件。 |
concat | concat | 拼接文件。 |
listCorruptFileBlocks | listCorruptFileBlocks | 列出损坏的文件块 |
msync | N/A | 没有对应的 HDFS 审计日志。 |
不支持的 HDFS 特有 API
以下 API 是 HDFS DistributedFileSystem 实现所特有的,并不属于通用的 org.apache.hadoop.fs.FileSystem API,因此不受 ofs 支持。不过,可参见下方脚注了解等效的 API。
| Operation | NameNode audit log | Description | Support |
|---|---|---|---|
getErasureCodingPolicy | getErasureCodingPolicy | 获取文件/目录的纠删码策略。 | 不支持 [6] |
setErasureCodingPolicy | setErasureCodingPolicy | 在目录上设置纠删码策略。 | 不支持 [6] |
unsetErasureCodingPolicy | unsetErasureCodingPolicy | 取消目录上的纠删码策略。 | 不支持 [6] |
addErasureCodingPolicies | addErasureCodingPolicies | 添加纠删码策略。 | 不支持 [6] |
getErasureCodingPolicies | getErasureCodingPolicies | 获取可用的纠删码策略。 | 不支持 [6] |
removeErasureCodingPolicy | removeErasureCodingPolicy | 移除纠删码策略。 | 不支持 [6] |
enableErasureCodingPolicy | enableErasureCodingPolicy | 启用纠删码策略。 | 不支持 [6] |
disableErasureCodingPolicy | disableErasureCodingPolicy | 禁用纠删码策略。 | 不支持 [6] |
getErasureCodingCodecs | getErasureCodingCodecs | 列出所有纠删码编解码器。 | 不支持 [6] |
getECTopologyResultForPolicies | getECTopologyResultForPolicies | 获取策略的纠删码拓扑结果。 | 不支持 [6] |
getSnapshotListing | ListSnapshot | 列出可快照目录的所有快照。 | 不支持 [6] |
allowSnapshot | allowSnapshot | 允许对目录进行快照。 | 不支持 [6] |
disallowSnapshot | disallowSnapshot | 禁止对目录进行快照。 | 不支持 [6] |
provisionSnapshotTrash | getfileinfo, mkdirs, setPermission | 为可快照目录预配回收站。 | 不支持 [6] |
createEncryptionZone | createEncryptionZone | 创建加密区。 | 不支持 [6] |
getEZForPath | getEZForPath | 获取路径所属的加密区。 | 不支持 [6] |
listEncryptionZones | listEncryptionZones | 列出所有加密区。 | 不支持 [6] |
reencryptEncryptionZone | reencryptEncryptionZone | 重新加密加密区。 | 不支持 [6] |
listReencryptionStatus | listReencryptionStatus | 列出重新加密状态。 | 不支持 [6] |
getFileEncryptionInfo | getfileinfo | 获取文件加密信息。 | 不支持 [6] |
provisionEZTrash | getEZForPath, getfileinfo, mkdirs, setPermission | 为加密区预配回收站。 | 不支持 [6] |
setQuota | clearQuota 或 clearSpaceQuota 或 setQuota 或 setSpaceQuota | 设置路径的配额使用量。 | 不支持 [6] |
getQuotaUsage | quotaUsage | 获取路径的配额使用量。 | 不支持 [6] |
setQuotaByStorageType | setSpaceQuota | 按存储类型设置路径的配额。 | 不支持 [6] |
unsetStoragePolicy | unsetStoragePolicy | 取消文件或目录上的存储策略。 | 不支持 |
setStoragePolicy | setStoragePolicy | 在文件或目录上设置存储策略。 | 不支持 |
getStoragePolicy | getStoragePolicy | 获取文件或目录的存储策略。 | 不支持 |
satisfyStoragePolicy | satisfyStoragePolicy | 使文件满足存储策略。 | 不支持 |
addCachePool | addCachePool | 添加缓存池。 | 不支持 |
modifyCachePool | modifyCachePool | 修改缓存池。 | 不支持 |
removeCachePool | removeCachePool | 移除缓存池。 | 不支持 |
listCachePools | listCachePools | 列出所有缓存池。 | 不支持 |
addCacheDirective | addCacheDirective | 添加缓存指令。 | 不支持 |
modifyCacheDirective | modifyCacheDirective | 修改缓存指令。 | 不支持 |
removeCacheDirective | removeCacheDirective | 移除缓存指令。 | 不支持 |
listCacheDirectives | listCacheDirectives | 列出缓存指令。 | 不支持 |
getSlowDatanodeStats | datanodeReport | 获取慢速 DataNode 统计信息。 | 不支持 |
saveNamespace | saveNamespace | 保存命名空间。 | 不支持 |
restoreFailedStorage | checkRestoreFailedStorage, enableRestoreFailedStorage, disableRestoreFailedStorage | 恢复故障存储。 | 不支持 |
refreshNodes | refreshNodes | 刷新节点。 | 不支持 |
setBalancerBandwidth | setBalancerBandwidth | 设置均衡器带宽。 | 不支持 |
metaSave | metaSave | 元数据保存。 | 不支持 |
rollingUpgrade | queryRollingUpgrade, 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 审计日志仅用于测试。
评论
登录后参与评论
KnowForge