文档首页/ MapReduce服务 MRS/ 故障排除/ 使用HDFS/ HDFS写并发较大时报副本不足
更新时间:2023-12-22 GMT+08:00

HDFS写并发较大时报副本不足

问题背景与现象

用户运行作业时写文件到HDFS,偶现写文件失败的情况。

操作日志如下:

105 | INFO  | IPC Server handler 23 on 25000 | IPC Server handler 23 on 25000, call org.apache.hadoop.hdfs.protocol.ClientProtocol.addBlock from 192.168.1.96:47728 Call#1461167 Retry#0 | Server.java:2278 
java.io.IOException: File /hive/warehouse/000000_0.835bf64f-4103 could only be replicated to 0 nodes instead of minReplication (=1).  There are 3 datanode(s) running and 3 node(s) are excluded in this operation.

原因分析

  • HDFS写文件的预约机制:无论文件是10 MB还是1 GB,开始写的每个块都会被预约128 MB。如果需要写入一个10 MB的文件,HDFS会预约一个块来写,当文件写完后,这个块只占实际大小10 MB,释放多余预约的118 MB空间。如果需要写入一个1 GB的文件,HDFS还是会预约一个块来写,这个块写完后再开启下一个块,文件写完后,实际占用1 GB磁盘,释放多余预约的空间。
  • 该异常通常是因为业务写文件的并发量太高,预约写Block的磁盘空间不足,导致写文件失败。

解决办法

  1. 登录HDFS的WebUI页面,进入DataNode的JMX页面。

    1. 在HDFS原生界面,选择Datanodes页面。
    2. 找到对应的DataNode节点,单击Http Address地址进入DataNode详情。
    3. 将url的“datanode.html”改为“jmx”就能获取到DataNode的JMX信息。

  2. 搜索“XceiverCount”指标,当该指标的值*Block块的大小超过DataNode磁盘的容量,就说明预约写Block的磁盘空间不足。
  3. 发生该问题,通常有以下两种方法来解决:

    方法一:降低业务的并发度。

    方法二:减少业务写文件的数目,将多个文件合并成一个文件来写。