HttpFS 网关
Ozone HttpFS 可用于通过 REST API 将 Ozone 与其他工具集成。
简介
HttpFS 是一个提供 REST HTTP 网关的服务,支持文件系统的读写操作。它与 WebHDFS REST HTTP API 互操作。
HttpFS 可用于访问防火墙后方 Ozone 集群上的数据。例如,HttpFS 服务充当网关,是唯一被允许穿越防火墙进入集群的系统。
HttpFS 可用于通过 HTTP 工具(如 curl 和 wget)以及非 Java 语言(如 Perl)的 HTTP 库访问 Ozone 中的数据。
WebHDFS 客户端 FileSystem 实现可用于访问 HttpFS,既可以通过 Ozone 文件系统命令行工具(ozone fs),也可以在 Java 应用中通过 Hadoop FileSystem Java API 使用。
note
如果 HttpFS 前端部署了负载均衡器,并且您使用 Kerberos(SPNEGO),客户端会为负载均衡器的主机名获取票据。请相应地配置 HttpFS 的 HTTP 主体和 keytab;参见负载均衡器背后的 HttpFS(Kerberos)。
快速开始
如需试用,请按照说明使用 Docker Compose 启动 Ozone 集群。
docker compose up -d --scale datanode=3现在你应该能在 Docker 中找到名为 ozone_httpfs 的 HttpFS 网关,可以通过 localhost:14000 访问它。HttpFS HTTP Web 服务 API 调用是 HTTP REST 调用,与 Ozone 文件系统操作一一对应。
以下是一些使用示例:
创建卷
# creates a volume called `volume1`.
curl -i -X PUT "http://localhost:14000/webhdfs/v1/volume1?op=MKDIRS&user.name=hdfs"示例输出:
HTTP/1.1 200 OK
Date: Sat, 18 Oct 2025 07:51:21 GMT
Cache-Control: no-cache
Expires: Sat, 18 Oct 2025 07:51:21 GMT
Pragma: no-cache
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Set-Cookie: hadoop.auth="u=hdfs&p=hdfs&t=simple-dt&e=1760809881100&s=OCdVOi8eyMguFySkmEJxm5EkRfj6NbAM9agi5Gue1Iw="; Path=/; HttpOnly
Content-Length: 17
{"boolean":true}创建存储桶
# creates a bucket called `bucket1`.
curl -i -X PUT "http://localhost:14000/webhdfs/v1/volume1/bucket1?op=MKDIRS&user.name=hdfs"示例输出:
HTTP/1.1 200 OK
Date: Sat, 18 Oct 2025 07:52:06 GMT
Cache-Control: no-cache
Expires: Sat, 18 Oct 2025 07:52:06 GMT
Pragma: no-cache
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Set-Cookie: hadoop.auth="u=hdfs&p=hdfs&t=simple-dt&e=1760809926682&s=yvOaeaRCVJZ+z+nZQ/rM/Y01pzEmS9Pe2mE9f0b+TWw="; Path=/; HttpOnly
Content-Length: 17
{"boolean":true}上传文件
echo "hello" >> ./README.txt
curl -i -X PUT "http://localhost:14000/webhdfs/v1/volume1/bucket1/user/foo/README.txt?op=CREATE&data=true&user.name=hdfs" -T ./README.txt -H "Content-Type: application/octet-stream"示例输出:
HTTP/1.1 100 Continue
HTTP/1.1 201 Created
Date: Sat, 18 Oct 2025 08:33:33 GMT
Cache-Control: no-cache
Expires: Sat, 18 Oct 2025 08:33:33 GMT
Pragma: no-cache
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Set-Cookie: hadoop.auth="u=hdfs&p=hdfs&t=simple-dt&e=1760812413286&s=09t7xKu/p/fjCJiQNL3bvW/Q7mTw28IbeNqDGlslZ6w="; Path=/; HttpOnly
Location: http://localhost:14000/webhdfs/v1/volume1/bucket1/user/foo/README.txt
Content-Type: application/json
Content-Length: 84
{"Location":"http://localhost:14000/webhdfs/v1/volume1/bucket1/user/foo/README.txt"}读取文件内容
# returns the content of the key `/user/foo/README.txt`.
curl 'http://localhost:14000/webhdfs/v1/volume1/bucket1/user/foo/README.txt?op=OPEN&user.name=foo'
hello支持的操作
以下是 WebHDFS REST API 及其在 Ozone 中的支持状态表。
文件和目录操作
| 操作 | 支持状态 |
|---|---|
| 创建并写入文件 | 支持 |
| 向文件追加内容 | Ozone 中尚未实现 |
| 拼接文件 | Ozone 中尚未实现 |
| 打开并读取文件 | 支持 |
| 创建目录 | 支持 |
| 创建符号链接 | Ozone 中尚未实现 |
| 重命名文件/目录 | 支持(存在限制) |
| 删除文件/目录 | 支持 |
| 截断文件 | Ozone 中尚未实现 |
| 获取文件/目录状态 | 支持 |
| 列出目录内容 | 支持 |
| 列出文件信息 | 支持 |
| 迭代列出目录内容 | 不支持 |
其他文件系统操作
| 操作 | 支持状态 |
|---|---|
| 获取目录的内容摘要 | 支持 |
| 获取目录的配额使用情况 | 支持 |
| 设置配额 | Ozone FileSystem API 中尚未实现 |
| 按存储类型设置配额 | Ozone 中尚未实现 |
| 获取文件校验和 | 不支持(待修复) |
| 获取主目录 | 不支持(待修复) |
| 获取回收站根目录 | 不支持 |
| 设置权限 | Ozone FileSystem API 中尚未实现 |
| 设置所有者 | Ozone FileSystem API 中尚未实现 |
| 设置副本因子 | Ozone FileSystem API 中尚未实现 |
| 设置访问或修改时间 | Ozone FileSystem API 中尚未实现 |
| 修改 ACL 条目 | Ozone FileSystem API 中尚未实现 |
| 删除 ACL 条目 | Ozone FileSystem API 中尚未实现 |
| 删除默认 ACL | Ozone FileSystem API 中尚未实现 |
| 删除 ACL | Ozone FileSystem API 中尚未实现 |
| 设置 ACL | Ozone FileSystem API 中尚未实现 |
| 获取 ACL 状态 | Ozone FileSystem API 中尚未实现 |
| 检查访问权限 | Ozone FileSystem API 中尚未实现 |
代理用户配置
HttpFS 支持代理用户(用户模拟)功能,允许一个用户代表另一个用户执行操作。当 HttpFS 用作网关并希望允许特定用户模拟其他用户时,此功能非常有用。
要配置代理用户,需要在 httpfs-site.xml 中添加以下属性。
配置属性
对于每个被允许执行模拟操作的用户,需要配置两个属性:
httpfs.proxyuser.#USER#.hosts:允许该用户执行模拟操作的主机列表。httpfs.proxyuser.#USER#.groups:可以被指定用户模拟的用户组列表。
将 #USER# 替换为被允许执行模拟操作的用户的实际用户名。
配置示例
<property>
<name>httpfs.proxyuser.knoxuser.hosts</name>
<value>*</value>
<description>
List of hosts the 'knoxuser' user is allowed to perform 'doAs'
operations.
The value can be the '*' wildcard or a comma-separated list of hostnames.
For multiple users, copy this property and replace the user name
in the property name.
</description>
</property>
<property>
<name>httpfs.proxyuser.knoxuser.groups</name>
<value>*</value>
<description>
List of groups the 'knoxuser' user is allowed to impersonate users
from to perform 'doAs' operations.
The value can be the '*' wildcard or a comma-separated list of group names.
For multiple users, copy this property and replace the user name
in the property name.
</description>
</property>在此示例中,用户 knoxuser 被允许从任意主机伪装成任意用户。在生产环境中,建议将这些值限制为特定的主机和组,而不是使用通配符 *。
故障排查
如果你遇到如下错误:
User: user/host @REALM is not allowed to impersonate user01这表示代理用户配置缺失或不正确。请确认:
httpfs.proxyuser.#USER#.hosts属性已设置为合适的主机值httpfs.proxyuser.#USER#.groups属性已设置为合适的组值- 修改配置后已重启 HttpFS 服务
关于 HttpFS 的 Hadoop 用户及开发文档
评论
登录后参与评论
KnowForge