背景:Hadoop集群 是部署在腾讯云,需要把云服务器的 防火墙关闭,且外网端口都放开
使用Hadoop中 (new Path(“file:///Users/Documents/”),new Path("/"));
讲本地文件上传到集群,报错:(): File /kkb/ could only be written to 0 of the 1 minReplication nodes. There are 3 datanode(s) running and 3 node(s) are excluded in this operation.
但是我在服务器通过命令 put ,touchz 都可以上传文件,说明集群是没有问题的
然后就开启我的踩坑出坑之旅。。。。
首先Google了一下,发现很多网友也出现过类似问题,大部分是NameNode格式化有问题, 通过 hadoop dfsadmin -report 查看了磁盘的状况,一切都是正常的。
然后发现一个网友说自己重新格式化NameNode之后就好了,我一咬牙一跺脚,决定也格式NameNode
格式化步骤如下:
1、 停止集群所有的服务。指令为:
2、删除hdfs中配置的data目录下的所有文件(级中配置的)。指令为:rm -rf /home/navy/tmp/*
3、重新格式化namenode。指令为:hadoop namenode -format
4、重新启动hadoop集群。指令为:
呀呼~ 好家伙,集群的DataNode都没有启动起来,查看日志:: Incompatible clusterIDs in /xxx/xxx/xxx/hadoopDatas/datanodeDatas: namenode clusterID = CID-8e61a7b3-8a25-48dd-b28b-c9410083731d; datanode clusterID = CID-4431b39e-9066-494b-ac12-eb2d5767cb08
好嘞 clusterID 变了,于是打开中关于datanode和namenode对应的目录,分别打开其中的current/VERSION文件,进行对比。将datanode 中的clusterID 改成和namenode中的一致(所有DataNode节点都需要改)
出现clusterID不一致的原因是:
执行hdfs namenode -format后,current目录会删除并重新生成,其中VERSION文件中的clusterID也会随之变化,而datanode的VERSION文件中的clusterID保持不变,造成两个clusterID不一致。
所以为了避免这种情况,可以再执行的namenode格式化之后,删除datanode的current文件夹,或者修改datanode的VERSION文件中出clusterID与namenode的VERSION文件中的clusterID一样,然后重新启动dfs。
DataNode启动成功之后,集群就可以用了,但是还是不能从本地上传文件;于是乎,继续Google。。。
终于发现有网友说 要在 配置客户端用hostname方式访问集群,于是解决办法就是 在所有节点上 修改 ,配置
<property>
<name></name>
<value>true</value>
<description>only cofig in clients</description>
</property>
java代码段加如下代码:
Configuration configuration=new Configuration();
("", "true");
FileSystem fileSystem=(new URI("hdfs://node01:8020"),configuration,"hadoop");
由于我的Hadoop集群都部署在腾讯云,集群默认会返回内网ip列表,所以需要设置=true;
并且在本地需要将datanode的hostname映射到公网的ip:
140.143.130.219 node01
211.159.170.202 node02
140.143.129.203 node03
至此问题就完美解决了。。。。。。。。出坑了,真开心~