Hadoop 3.x File XXX could only be written to 0 of the 1 minReplication
今天在用Java API 操作Hadoop 3.2.2 的时候,碰到一个错误,如下:
File XXX could only be written to 0 of the 1 minReplication nodes…
1 | 例如: |
网上搜索的解决方案:
原因大致有几种:
原因一:NameNode ClusterID 与 DataNode ClusterID 不一致
解决方案:
(1)将DataNode的版本,修改到与NameNode一致。
(2)重启集群。注意,千万不要执行namenode的格式化。
原因二:DataNode空间没有了
解决方案:
(1)清理提供空间。
尝试了一下,没有解决问题。然后去查看了一下客户端的日志,发现初始有个报错:
1 | java java.net.UnknownHostException |
于是尝试解决先此问题。根据日志上下文,推断是客户端连接datanode的时候报错了。
遇是,先将此问题解决,最终问题解决。
所以,出现“File XXX could only be written to 0 of the 1 minReplication nodes…”可能是原因三。
原因三:客户端与DataNode连接有问题。
解决方案:保证客户端与DataNode连接正常。
问题出现原因是什么呢?
我是将Hadoop通过Docker部署在虚拟机上了,部署的是伪分布式版本。Container在启动的时候没有把DataNode的端口暴露出来,导致客户端连接不上。
定位到原因解决方案就很简单了:修改Container暴露的接口。解决。
后续复盘:其实这个问题应该比较容易定位。因为除了控制台报错之外,在Hadoop里面的表现是,文件创建成功了,但是文件内容为空。所以流程应该是Hadoop通过NameNode已经创建了文件,但是在后续在向DataNode传递文件内容的时候报错了。
Java操作Hadoop过程中碰到不少问题,以下Blog非常有价值。感谢!
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.