0.背景
- 三台centos7的虚拟机进行了完全分布式模式的搭建 ,Hadoop版本2.7.1
- 虚拟机 node1为NameNode
- node2 为SecondNameNode和DataNode
- node3 为 DataNode
- 该项目是基于HDFS的网盘项目,有上传文件的需求
解决方法:关闭所有虚拟机的防火墙!或者打开DataNode主机的指定端口:50010、50020
systemctl stop firewalld.service
1. 报错
做文件上传时,前端上传文件报错,具体如下:
File /aaa/a.txt.COPYING could only be replicated to 0 nodes instead of minReplication (=1). There are 2 datanode(s) running and 2 node(s) are excluded in this operation.
at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:1550)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getNewBlockTargets(FSNamesystem.java:3110)
……
用 hadoop fs -put 命令上传也报错
基本分析不是项目前后端代码的问题,考虑Hadoop本身问题。
2.解决
查询资料发现如果问题在Hadoop,可以有如下?
- DataNode未成功启动,这个可以在虚拟机里用jps命令查看是否有DataNode的进程
jps
- 可能是hdfs存储空间不够了,在虚拟机node1输入命令查看
hdfs dfsadmin -report
显然不是,我这里还有10多G的 Remaining
3. centOS7的防火墙问题,导致Hadoop集群通讯出现很多问题。我安装的时候并没有直接关闭firewall防火墙,而是放行了当时需要的几个端口,50070之类。
关闭所有虚拟机防火墙果然成功。
systemctl stop firewalld.service
3.粗暴关闭有必要吗?
虽然是虚拟机里的集群,安全无所谓。但直接关闭防火墙太粗暴,还是放行端口优雅,我测试后发现把所有DataNode下放行如下端口即可,我的DataNode 是Node2 和 Node3。
- firewall-cmd --zone=public --add-port=50010/tcp --permanent
- firewall-cmd --zone=public --add-port=50020/tcp --permanent
- firewall-cmd --zone=public --add-port=50075/tcp --permanent
- firewall-cmd --reload
(50075其实不是必须的)
我的node1(NameNode)
我的node3(DataNode)
端口信息参考这里Hadoop3.0开始,需要防火墙开放的端口