今天在用Java API 操作Hadoop 3.2.2 的时候,碰到一个错误,如下:

File XXX could only be written to 0 of the 1 minReplication nodes…

1
2
3
例如:
org.apache.hadoop.ipc.RemoteException(java.io.IOException):
File /test/test2.txt could only be written to 0 of the 1 minReplication nodes. There are 1 datanode(s) running and 1 node(s) are excluded in this operation.

网上搜索的解决方案:

原因大致有几种:

原因一: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非常有价值。感谢!

https://www.zifangsky.cn/1292.html