本文介绍写入文件提示DataXceiver Premature EOF from inputStream异常的解决方案。

具体报错

DataXceiver error processing WRITE_BLOCK operation src: /10.*.*.*:35692 dst: /10.*.*.*:50010 java.io.IOException: Premature EOF from inputStream

问题原因

通常为了不断地向HDFS写入新的数据,作业会打开较多的HDFS文件写入流(Stream)。但HDFS允许同时打开的文件数量是有限的,受限于DataNode参数,超过限制就会出现DataXceiver Premature EOF from inputStream异常。

解决方案

查看DataNode日志,参见HDFS服务日志,一般会有如下报错。
java.io.IOException: Xceiver count 4097 exceeds the limit of concurrent xcievers: 4096
at org.apache.hadoop.hdfs.server.datanode.DataXceiverServer.run(DataXceiverServer.java:150)
如果存在报错,可通过以下方式解决:
  1. 登录EMR on ECS控制台
  2. 在顶部菜单栏处,根据实际情况选择地域和资源组
  3. 进入HDFS服务的配置页面。
    1. 集群管理页面,单击目标集群操作列的集群服务
    2. 集群服务页面,单击HDFS服务区域的配置
  4. 在配置搜索区域,搜索参数dfs.datanode.max.transfer.threads,并适当地调大该参数值,一般建议翻倍增加,例如8192、16384。
    说明 dfs.datanode.max.transfer.threads参数表示DataNode处理读写数据流的线程池大小,默认值为4096个。