Hadoop 本地上传文件报错: could only be written to 0 of the 1 minReplication nodes. There are 3 datanode(s)

背景:Hadoop集群 是部署在腾讯云,需要把云服务器的 防火墙关闭,且外网端口都放开
使用Hadoop中 fileSystem.moveFromLocalFile(new Path(“file:///Users/Documents/b.txt”),new Path("/"));
讲本地文件上传到集群,报错:org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /kkb/a.txt.zip 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、 停止集群所有的服务。指令为:stop-all.sh
2、删除hdfs中配置的data目录下的所有文件(级core-site.xml中配置的hadoop.tmp.dir)。指令为:rm -rf /home/navy/tmp/*
3、重新格式化namenode。指令为:hadoop namenode -format
4、重新启动hadoop集群。指令为:start-all.sh
呀呼~ 好家伙,集群的DataNode都没有启动起来,查看日志:java.io.IOException: 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 变了,于是打开hdfs-site.xml中关于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。。。
终于发现有网友说 要在hdfs-site.xml 配置客户端用hostname方式访问集群,于是解决办法就是 在所有节点上 修改 hdfs-site.xml ,配置

<property>
    <name>dfs.client.use.datanode.hostname</name>
    <value>true</value>
    <description>only cofig in clients</description>
 </property>

java代码段加如下代码:

Configuration configuration=new Configuration();
 configuration.set("dfs.client.use.datanode.hostname", "true");
  FileSystem fileSystem=FileSystem.get(new URI("hdfs://node01:8020"),configuration,"hadoop");

由于我的Hadoop集群都部署在腾讯云,集群默认会返回内网ip列表,所以需要设置dfs.client.use.datanode.hostname=true;
并且在本地需要将datanode的hostname映射到公网的ip:

140.143.130.219  node01
211.159.170.202  node02
140.143.129.203  node03

至此问题就完美解决了。。。。。。。。出坑了,真开心~

  • 12
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值