Datanode报InvalidProtocolBufferException异常

Datanode报InvalidProtocolBufferException异常

现象描述

DataNode无法发送block报告给NameNode。以下为DataNode日志信息:

java.lang.IllegalStateException: com.google.protobuf.InvalidProtocolBufferException: 
Protocol message was too large.  May be malicious.  Use CodedInputStream.setSizeLimit() 
to increase the size limit exception

可能原因

此类故障发生在DataNode向NameNode发送block报告时。HDFS是专门为大文件设计的,所以为了防止其用于小文件上,限制了每个卷的block报告的体积。

定位思路

以防这类异常发生,用户可指定多种“dfs.datanode.data.dir”,在多个卷内将block分散开来,block报告消息的体积将会变小。

在运行的环境中遇到此类异常时,Hadoop目前无法做到自动完成上述修复。

处理步骤

  1. 关闭相关的DataNode。
  2. 使用mv命令将block副本和meta对从“dfs.datanode.data.dir”目录移动到新目录下,同时确保块在磁盘间移动时subdir目录的结构始终完全保持不变。 例如,如果block副本和meta对是在“/data/1/dfs/dn/current/BP-1788246909-10.10.1.202-1412278461680/current/finalized/subdir0/subdir1/”目录下,若想要将其移动到“/data/5/disk”下,必须移到相同的子目录结构,即“/data/5/dfs/dn/current/BP-1788246909-10.10.1.202-1412278461680/current/finalized/subdir0/subdir1/”。 如果目录结构发生改变,移动后的DataNode将不能定位副本。
  3. 重启DataNode。

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627

发表评论

邮箱地址不会被公开。 必填项已用*标注