如何解决Docker容器中Hadoop WebUI上传文件提示「无法上传文件」的错误
问题根因
你遇到的是Docker部署HDFS时WebHDFS的典型跨网络访问问题:
- 你已经配置了datanode的9864端口映射,但namenode返回给浏览器的datanode访问地址是Docker内部的主机名/内网IP,本地操作系统无法解析该地址,导致请求直接失败。
- 另一个常见诱因是HDFS目录权限不足,Web UI默认的匿名访问用户
dr.who没有目标目录的写入权限。
解决方案
步骤1:修改docker-compose配置,强制datanode宣告对外地址为localhost
在docker-compose.yml的services.datanode配置段,补充环境变量配置,完整示例如下:
services: namenode: image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8 ports: - 9870:9870 environment: - CLUSTER_NAME=test env_file: - ./hadoop.env datanode: image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8 ports: - 9864:9864 environment: # 核心配置:声明datanode对外暴露的主机名为localhost - HDFS_DATANODE_HOST_NAME=localhost - HDFS_DATANODE_HTTP_ADDRESS=0.0.0.0:9864 env_file: - ./hadoop.env depends_on: - namenode
步骤2:重启服务验证配置生效
执行以下命令重启集群:
docker-compose down docker-compose up -d
等待30秒待服务完全启动后,先测试本地9864端口连通性:
telnet localhost 9864
如果连通正常,打开浏览器无痕模式访问HDFS Web UI,先尝试将文件上传到/tmp目录(该目录默认开放匿名写入权限),排查是否为权限问题。
步骤3:权限问题修复(如果上传到/tmp正常,上传其他目录报错)
执行以下命令给目标目录开放写入权限:
# 替换namenode为你的namenode容器名称,/target为你要上传的目标目录 docker exec -it namenode hdfs dfs -chmod 777 /target
其他排查点
- 执行
docker ps检查datanode的端口映射是否为0.0.0.0:9864->9864/tcp,如果存在端口占用,修改映射为其他未被占用的端口即可。 - 执行
docker logs datanode查看datanode运行日志,确认没有地址绑定错误。
内容的提问来源于stack exchange,提问作者Yangwook Ian Jeong
相关产品推荐
相关产品推荐

