Docker Swarm部署Hadoop3.3.6集群HDFS写入失败:无法找到DataNode
HDFS写入失败排查(Docker Swarm部署Hadoop 3.3.6集群)
问题现象
通过Docker Swarm搭建Hadoop 3.3.6集群,共3台物理机:1台部署NameNode,所有机器均部署DataNode。集群启动后NameNode、DataNode状态显示正常,WebUI无异常,但向HDFS写入数据时完全失败,NameNode日志出现如下警告:
2025-07-27 22:49:08,291 DEBUG org.apache.hadoop.hdfs.server.namenode.FSEditLog: logSync(tx) synctxid=3 lastJournalledTxId=4 mytxid=4 2025-07-27 22:49:08,443 TRACE org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy: storageTypes={DISK=3} 2025-07-27 22:49:08,444 DEBUG org.apache.hadoop.net.NetworkTopology: Failed to find datanode (scope="" excludedScope="/rack0"). numOfDatanodes=0 2025-07-27 22:49:08,444 DEBUG org.apache.hadoop.net.NetworkTopology: No node to choose. 2025-07-27 22:49:08,445 DEBUG org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy: [ Datanode None is not chosen since required storage types are unavailable for storage type DISK. 2025-07-27 22:49:08,445 INFO org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy: Not enough replicas was chosen. Reason: {NO_REQUIRED_STORAGE_TYPE=1} 2025-07-27 22:49:08,445 DEBUG org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy: Failed to choose remote rack (location = ~/rack0), fallback to local rack org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy$NotEnoughReplicasException:
环境信息
- Hadoop版本:3.3.6
- JDK版本:17
- 集群架构:Docker Swarm部署,3台物理机,1个NameNode,3个DataNode(每台机器1个)
相关截图
- DataNode状态截图:

- NameNode概览截图:

- NameNode概览截图:

问题分析与解决方案
从日志核心报错NO_REQUIRED_STORAGE_TYPE=1和Failed to find datanode (scope="" excludedScope="/rack0"). numOfDatanodes=0来看,问题集中在机架感知配置、DataNode存储识别或Docker网络层面,按以下步骤排查:
1. 机架感知配置修正
日志显示NameNode排除/rack0机架后无可用节点,说明拓扑配置异常:
- 检查所有节点的
hadoop-env.sh,确保HADOOP_CONF_DIR指向统一配置目录,保证机架配置文件一致 - 若用静态映射:确认
topology.mapfile中所有DataNode的IP对应机架标识正确,避免所有节点都被归到/rack0,导致副本跨机架选择时无节点可用 - 若用动态脚本:确保
topology.script.file.name指定的脚本在Docker容器内可执行,且能正确返回每个DataNode的机架标识 - 临时测试:修改
hdfs-site.xml中dfs.block.replicas.proximity.aware为false,关闭机架感知后重启NameNode,验证写入是否恢复
2. DataNode存储类型验证
针对required storage types are unavailable for storage type DISK报错:
- 检查
hdfs-site.xml中dfs.datanode.data.dir配置的路径,确保Docker容器内挂载的宿主机目录存在、hadoop用户有读写权限 - 确认
dfs.storage.policy.enabled为true时,DataNode已正确注册DISK类型存储,查看DataNode日志是否有存储目录初始化失败的报错(如权限不足、磁盘空间不足)
3. Docker网络配置检查
Docker Swarm网络可能导致节点通信异常:
- 确保所有容器使用同一可附加(
attachable)的Swarm overlay网络 - 检查
core-site.xml中fs.defaultFS是否使用NameNode的Swarm服务名或宿主机可访问的IP,避免用localhost或容器内部IP导致通信阻断 - 通过NameNode WebUI的DataNode列表,确认每个节点的注册地址可被NameNode正常访问
4. 副本数调整测试
检查hdfs-site.xml中dfs.replication配置,默认值为3。若机架感知导致部分节点被排除,实际可用节点数可能不足3,可临时将副本数改为1,测试写入是否正常,以此验证副本策略是否为问题诱因
内容的提问来源于stack exchange,提问作者jcyan
相关产品推荐
相关产品推荐

