Hadoop问题:Premature EOF: no length prefix available

      最近Hadoop 2.4集群发现一个奇怪的问题,问题的表现是一个hive任务报错,报无法找到文件,我到集群上cat相关文件也无法找到三个副本中的任何一个,但是通过fsck找到相关block的位置后,到机器上却能够找到这个block,并且block没有任何损坏。

      报错的错误日志是:

      add to deadNodes and continue. java.io.EOFException: Premature EOF: no length prefix available

      找到相关代码,发现时PB发送请求后没有返回数据。突然想到这个可能是DataNode没有响应DFSClient,第一是有可能DataNode的机器打开文件数过少,这个首先排除了,我们集群安装都是没有问题的,打开文件数都是65535。第二是DataNode自身的设置,查看后发现没有设置打开文件数,默认的设置是4096,应该能够满足要求。最后我对DataNode进行了jstack,后来发现有大量的Short circuit 本地读线程hang住,总共4096个,导致了这台机器无法响应其它的请求。当三台具有相同副本的机器都hang住后,就会出现这个问题。

      找到hadoop out的日志之后,发现了这个异常:

Exception in thread “Thread-19″ java.util.ConcurrentModificationException

        at java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1100)

        at java.util.TreeMap$ValueIterator.next(TreeMap.java:1145)

        at org.apache.hadoop.net.unix.DomainSocketWatcher$1.run(DomainSocketWatcher.java:465)

        at java.lang.Thread.run(Thread.java:662)

      查询后发现,原来是DomainSocketWatcher这个类内部的线程在finally时候没有将treemap加锁导致了ConcurrentModificationException。

      查询jira,发现社区已经找到了这个问题,并提供了patch,地址是:

https://issues.apache.org/jira/browse/HADOOP-10404

      这个问题还真是比较无语。

Print Friendly

jiang yu

Leave a Reply