客户端接口

HttpFS 网关

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

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

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 中尚未实现
删除默认 ACLOzone FileSystem API 中尚未实现
删除 ACLOzone FileSystem API 中尚未实现
设置 ACLOzone FileSystem API 中尚未实现
获取 ACL 状态Ozone FileSystem API 中尚未实现
检查访问权限Ozone FileSystem API 中尚未实现

代理用户配置

HttpFS 支持代理用户(用户模拟)功能,允许一个用户代表另一个用户执行操作。当 HttpFS 用作网关并希望允许特定用户模拟其他用户时,此功能非常有用。

要配置代理用户,需要在 httpfs-site.xml 中添加以下属性。

配置属性

对于每个被允许执行模拟操作的用户,需要配置两个属性:

  1. httpfs.proxyuser.#USER#.hosts :允许该用户执行模拟操作的主机列表。
  2. 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

这表示代理用户配置缺失或不正确。请确认:

  1. httpfs.proxyuser.#USER#.hosts 属性已设置为合适的主机值
  2. httpfs.proxyuser.#USER#.groups 属性已设置为合适的组值
  3. 修改配置后已重启 HttpFS 服务

关于 HttpFS 的 Hadoop 用户及开发文档

评论

登录后参与评论

正在加载评论…