登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

阿亮的博客

据说,世界上本没有懂,装懂装久了,也就懂了!

 
 
 

日志

 
 
关于我

我很平凡 趁年轻想多去走走看看 很多目标离我还很遥远 但我一定会把它们实现

 
 

Hadoop与ssh_exchange_identification  

2009-08-27 14:31:46|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

       最近遇到hadoop与ssh_exchange_identification的问题,情况大致是这样的。一台中心机,有个主shell,这个脚本会控制其他各台db机dump数据并put到hadoop集群。其中db里最老的表的数据量特别大,再更老的表是没数据的(空表),dump和put是并发的,即前面那张表刚dump完,就另起一个进程去put,dump完就会马上dump下一张表的数据了。问题就出在有表数据的表和没表数据表的交接处。当dump完那张有数据的表数据后,这张表的数据还在put到hadoop表的时候,其他没有表数据的表马上dump完并开始put了,而且也马上能put完。当这种空表比较少时是没有问题的,但比较多时就出现了ssh_exchange_identification: Connection closed by remote host错误,导致主shell失去与子shell的联系,从而主shell退出。

       根据观察来看,这个问题很有可能是hadoop端的问题,有可能是hadoop不允许同时put的量,或是不允许太多空文件put上去。不put空文件或减少空文件的put量,这个问题就解决了。

      今天测试了一下,基本确认是put空文件引起的问题了。因为抛出了:

09/08/28 15:05:56 WARN hdfs.DFSClient: Problem renewing lease for DFSClient_-1034768104
java.io.IOException: Call to hadoopmanager201.koubei.com/10.35.83.201:9100 failed on local exception: java.nio.channels.ClosedByInterruptException
 at org.apache.hadoop.ipc.Client.wrapException(Client.java:774)
 at org.apache.hadoop.ipc.Client.call(Client.java:742)
 at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:220)
 at $Proxy0.renewLease(Unknown Source)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:82)
 at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:59)
 at $Proxy0.renewLease(Unknown Source)
 at org.apache.hadoop.hdfs.DFSClient$LeaseChecker.renew(DFSClient.java:1016)
 at org.apache.hadoop.hdfs.DFSClient$LeaseChecker.run(DFSClient.java:1028)
 at java.lang.Thread.run(Thread.java:619)
Caused by: java.nio.channels.ClosedByInterruptException
 at java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:184)
 at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:341)
 at org.apache.hadoop.net.SocketOutputStream$Writer.performIO(SocketOutputStream.java:55)
 at org.apache.hadoop.net.SocketIOWithTimeout.doIO(SocketIOWithTimeout.java:142)
 at org.apache.hadoop.net.SocketOutputStream.write(SocketOutputStream.java:146)
 at org.apache.hadoop.net.SocketOutputStream.write(SocketOutputStream.java:107)
 at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
 at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
 at java.io.DataOutputStream.flush(DataOutputStream.java:106)
 at org.apache.hadoop.ipc.Client$Connection.sendParam(Client.java:480)
 at org.apache.hadoop.ipc.Client.call(Client.java:720)
 ... 12 more

put的空文件少的时候还不一定抛这个错误,有时甚至是没问题的。但空文件一多必抛上面异常。这个现象再加上网上对java.nio.channels.ClosedByInterruptException异常的说明:“当在某个信道的 I/O 操作中处于阻塞状态的某个线程被另一个线程中断时,该线程将收到此经过检查的异常。抛出此异常前将关闭该信道,并设置先前处于阻塞状态的线程的中断状态。”,这样就可以大致推断,当空文件太多并同时put时(文件大小为0,put速度很快)造成阻塞引起的。

  评论这张
 
阅读(2696)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018