问题描述
最近在复用一个之前搭建好的大数据测试平台时,发现通过 HDFS 的 Web 界面上传文件失败了,浏览器报错如下:
Couldn't upload the file xxxx.yyy

之前使用 Web 上传功能是正常的,这次突然出现报错,需要逐步排查原因。
(一)排查一:目录权限问题
现象分析
在 HDFS 中,通过命令行创建的目录,其所属用户是当前 Linux 登录用户(例如 ac);而通过 Web 界面创建的目录,默认所属用户是 dr.who。
如果目录权限设置不当,可能导致 Web 用户没有写入权限。
尝试修复
首先尝试放宽目标目录的写权限:
bash
hdfs dfs -chmod +w /thePathName
结果:重新上传文件,依然失败。 ❌
进一步检查
检查 hdfs-site.xml 中的权限配置:
bash
vim hdfs-site.xml
关键配置项如下:
xml
<configuration>
...
<property>
<!-- 测试环境可将 HDFS 权限检查关闭,便于多用户访问 -->
<name>dfs.permissions</name>
<value>true</value>
</property>
...
</configuration>
注:若将
dfs.permissions设为false,则关闭 HDFS 的文件权限检查,所有用户均可随意访问。生产环境不建议关闭。
结论:本次问题并非由目录权限引起。
(二)排查二:域名解析问题
关键线索
按 F12 打开浏览器开发者工具,在控制台发现了关键错误信息:
(内部请求使用了配置中的主机名,而非 IP 地址)

原因定位
回想起之前测试成功时,浏览器和服务器在同一台机器上,且本地 hosts 文件中配置了各虚拟机的主机名与 IP 映射关系。
而这次使用的是另一台电脑,直接通过 IP 地址访问 HDFS Web 界面:
http://192.168.168.121:9870/explorer.html
问题根源: HDFS 的 Web 上传功能在后台通信时,使用的是配置文件中的主机名(如 vm00、vm01 等),而非访问时使用的 IP 地址。如果浏览器所在机器无法解析这些主机名,上传请求就会失败。
解决方案
在浏览器所在机器的 hosts 文件中,添加 HDFS 集群各节点的主机名映射:
bash
# Linux/Mac: /etc/hosts
# Windows: C:\Windows\System32\drivers\etc\hosts
192.168.168.121 vm00
192.168.168.122 vm01
192.168.168.123 vm02
192.168.168.124 vm10
192.168.168.125 vm11
# ... 其他节点
刷新 DNS 缓存
修改 hosts 文件后,需要刷新 DNS 缓存使其立即生效:
Windows 系统:
cmd
ipconfig /flushdns
Linux 系统:
bash
sudo systemctl restart systemd-resolved
# 或
sudo service network-manager restart
macOS 系统:
bash
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
验证结果
刷新 DNS 后,重新通过 Web 界面上传文件,上传成功! ✅
总结
| 排查项 | 结果 | 说明 |
|---|---|---|
| 目录权限 | ❌ 不是原因 | chmod +w 和 dfs.permissions 配置均正常 |
| 域名解析 | ✅ 根本原因 | 浏览器所在机器需能解析 HDFS 节点主机名 |
核心要点: 使用 HDFS Web 界面上传文件时,浏览器所在计算机必须能够正确解析 HDFS 集群中各节点的主机名。建议通过配置本地 hosts 文件或搭建内网 DNS 服务来解决。