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目前无法做到自动完成上述修复。
处理步骤
- 关闭相关的DataNode。
- 使用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将不能定位副本。
- 重启DataNode。