本文介绍写入文件提示无法满足最小写入副本要求问题的原因和解决方案。
具体报错
报错信息如下所示。其中,【X】
是当前正在运行的DataNode数量,【Y】
是被排除在此操作之外的DataNode数量。
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /foo/file1 could only be written to 0 of the 1 minReplication nodes,there are 【X】 datanode(s) running and 【Y】 node(s) are excluded in this operation.
问题原因
该问题表示在当前的集群状态下,因为无法满足文件的最小副本数量,HDFS无法将文件写入到指定路径中。
解决方案
如果【X】为0,说明集群DataNode上报NameNode路径出现问题,需要检查以下方面:
检查DataNode节点是否可以连通NameNode节点。
如果连通的命令长时间或超时不返回信息,则可通过以下命令,检查NameNode节点和DataNode节点是否在同一安全组下。
hadoop dfs -ls /
检查DataNode服务是否启动。
登录DataNode服务所在节点,请参见登录集群。
切换到hdfs用户。
su - hdfs
执行以下命令,查看是否有DataNode进程正在运行。
jps
如果返回信息中包含DataNode,则表示DataNode进程正在运行。
如果【Y】不为0,说明某些DataNode节点被HDFS客户端排除,需要检查以下方面:
检查HDFS客户端是否可以连通所有DataNode节点。
检查DataNode节点的负载是否过高。DataNode负载过高时或者DataNode本身容量太小,同时写入多个文件会导致DataNode无法处理NameNode的分块请求,需要对DataNode进行扩容。
说明您可以通过HDFS Web UI查看DataNode节点的负载,详细信息请参见HDFS Web UI介绍。
如果【X】不为0,并且【X】>【Y】,可检查以下方面。
如果DataNode数量较少(少于10台)或容量较满,并且集群中存在大量写入小文件的作业,可能会导致NameNode无法找到合适的DataNode节点进行写入。这种情况常见于Flink Checkpoint写入HDFS;Hive或Spark动态分区写入作业需要大量分区的场景。
为了解决这个问题,您可以增加集群中DataNode的数量或者容量。推荐扩容DataNode的数量,一般情况下可以快速解决此类问题,并且后续进行缩容也更加方便,从而更好地满足大量小文件的写入需求。此外,您也可以使用OSS-HDFS服务的存算分离方案来实现更高的性价比。