/hbase和#x2B的连接丢失;对等方重置连接?

/hbase和#x2B的连接丢失;对等方重置连接?,hbase,apache-zookeeper,Hbase,Apache Zookeeper,我正在本地机器(伪分布式)上运行一个Hadoop MapReduce作业,该机器从HBase进行读取和写入。我时断时续地收到一个错误,它会中断工作,即使计算机没有其他重要进程运行,也会中断工作——请参阅下面的日志。作业终止后ZooKeeper转储的输出如下所示,运行失败后客户端数量会增加: HBase is rooted at /hbase Master address: SS-WS-M102:60000 Region server holding ROOT: SS-WS-M102:60020

我正在本地机器(伪分布式)上运行一个Hadoop MapReduce作业,该机器从HBase进行读取和写入。我时断时续地收到一个错误,它会中断工作,即使计算机没有其他重要进程运行,也会中断工作——请参阅下面的日志。作业终止后ZooKeeper转储的输出如下所示,运行失败后客户端数量会增加:

HBase is rooted at /hbase
Master address: SS-WS-M102:60000
Region server holding ROOT: SS-WS-M102:60020
Region servers:
 SS-WS-M102:60020
Quorum Server Statistics:
 ss-ws-m102:2181
  Zookeeper version: 3.3.3-cdh3u0--1, built on 03/26/2011 00:20 GMT
  Clients:
   /192.168.40.120:58484[1]\(queued=0,recved=39199,sent=39203)
   /192.168.40.120:37129[1]\(queued=0,recved=162,sent=162)
   /192.168.40.120:58485[1]\(queued=0,recved=39282,sent=39316)
   /192.168.40.120:58488[1]\(queued=0,recved=39224,sent=39226)
   /192.168.40.120:58030[0]\(queued=0,recved=1,sent=0)
   /192.168.40.120:58486[1]\(queued=0,recved=39248,sent=39267)
我的开发团队目前正在使用CDH3U0发行版,所以HBase 0.90.1——这是一个在较新版本中解决的问题吗?或者我应该对当前的设置做些什么?我是否应该期望重新启动ZK并定期终止客户端?我愿意接受任何合理的选择,让我的工作始终如一地完成

2012-06-27 13:01:07,289 INFO org.apache.zookeeper.ClientCnxn: Opening socket connection to server SS-WS-M102/192.168.40.120:2181
2012-06-27 13:01:07,289 INFO org.apache.zookeeper.ClientCnxn: Socket connection established to SS-WS-M102/192.168.40.120:2181, initiating session
2012-06-27 13:01:07,290 WARN org.apache.zookeeper.ClientCnxn: Session 0x0 for server SS-WS-M102/192.168.40.120:2181, unexpected error, closing socket connection and attempting reconnect
java.io.IOException: Connection reset by peer
    at sun.nio.ch.FileDispatcher.read0(Native Method)
    at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:21)
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:202)
    at sun.nio.ch.IOUtil.read(IOUtil.java:169)
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:243)
    at org.apache.zookeeper.ClientCnxn$SendThread.doIO(ClientCnxn.java:858)
    at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1130)
[lines above repeat 6 more times]
2012-06-27 13:01:17,890 ERROR org.apache.hadoop.hbase.mapreduce.TableInputFormat: org.apache.hadoop.hbase.ZooKeeperConnectionException: org.apache.hadoop.hbase.ZooKeeperConnectionException: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getZooKeeperWatcher(HConnectionManager.java:991)
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.setupZookeeperTrackers(HConnectionManager.java:302)
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.<init>(HConnectionManager.java:293)
    at org.apache.hadoop.hbase.client.HConnectionManager.getConnection(HConnectionManager.java:156)
    at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:167)
    at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:145)
    at org.apache.hadoop.hbase.mapreduce.TableInputFormat.setConf(TableInputFormat.java:91)
    at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:62)
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:605)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:322)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1115)
    at org.apache.hadoop.mapred.Child.main(Child.java:262)
Caused by: org.apache.hadoop.hbase.ZooKeeperConnectionException: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase
    at org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher.<init>(ZooKeeperWatcher.java:147)
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getZooKeeperWatcher(HConnectionManager.java:989)
    ... 15 more
Caused by: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:90)
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:42)
    at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:637)
    at org.apache.hadoop.hbase.zookeeper.ZKUtil.createAndFailSilent(ZKUtil.java:902)
    at org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher.<init>(ZooKeeperWatcher.java:133)
    ... 16 more
2012-06-27 13:01:07289 INFO org.apache.zookeeper.ClientCnxn:打开到服务器SS-WS-M102/192.168.40.120:2181的套接字连接
2012-06-27 13:01:07289 INFO org.apache.zookeeper.ClientCnxn:已建立到SS-WS-M102/192.168.40.120:2181的套接字连接,正在启动会话
2012-06-27 13:01:07290警告org.apache.zookeeper.ClientCnxn:服务器SS-WS-M102/192.168.40.120:2181的会话0x0,意外错误,正在关闭套接字连接并尝试重新连接
java.io.IOException:对等方重置连接
位于sun.nio.ch.FileDispatcher.read0(本机方法)
读取(SocketDispatcher.java:21)
位于sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:202)
位于sun.nio.ch.IOUtil.read(IOUtil.java:169)
在sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:243)
位于org.apache.zookeeper.ClientCnxn$SendThread.doIO(ClientCnxn.java:858)
位于org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1130)
[上面的行再重复6次]
2012-06-27 13:01:17890错误org.apache.hadoop.hbase.mapreduce.TableInputFormat:org.apache.hadoop.hbase.ZooKeeperConnectionException:org.apache.hadoop.hbase.ZooKeeperConnectionException:org.apache.zookeeper.KeeperException$ConnectionLossException:keeperrorCode=ConnectionLoss for/hbase
位于org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getZookePerWatcher(HConnectionManager.java:991)
位于org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.setupZookeeperTrackers(HConnectionManager.java:302)
位于org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.(HConnectionManager.java:293)
位于org.apache.hadoop.hbase.client.HConnectionManager.getConnection(HConnectionManager.java:156)
位于org.apache.hadoop.hbase.client.HTable.(HTable.java:167)
位于org.apache.hadoop.hbase.client.HTable.(HTable.java:145)
位于org.apache.hadoop.hbase.mapreduce.TableInputFormat.setConf(TableInputFormat.java:91)
位于org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:62)
位于org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117)
位于org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:605)
位于org.apache.hadoop.mapred.MapTask.run(MapTask.java:322)
位于org.apache.hadoop.mapred.Child$4.run(Child.java:268)
位于java.security.AccessController.doPrivileged(本机方法)
位于javax.security.auth.Subject.doAs(Subject.java:396)
位于org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1115)
位于org.apache.hadoop.mapred.Child.main(Child.java:262)
原因:org.apache.hadoop.hbase.ZooKeeperConnectionException:org.apache.zookeeper.KeeperException$ConnectionLossException:keeperrorcode=ConnectionLoss for/hbase
位于org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher.(ZooKeeperWatcher.java:147)
位于org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getZookePerWatcher(HConnectionManager.java:989)
... 还有15个
原因:org.apache.zookeeper.KeeperException$ConnectionLossException:KeeperErrorCode=ConnectionLoss for/hbase
位于org.apache.zookeeper.keeprexception.create(keeprexception.java:90)
位于org.apache.zookeeper.keeprexception.create(keeprexception.java:42)
在org.apache.zookeeper.zookeeper.create上(zookeeper.java:637)
位于org.apache.hadoop.hbase.zookeeper.ZKUtil.createAndFailSilent(ZKUtil.java:902)
位于org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher.(ZooKeeperWatcher.java:133)
... 还有16个

我过去也遇到过类似的问题。在使用HBase/Hadoop的很多时候,您会看到错误消息,这些消息并没有指出您遇到的真正问题,因此您必须对其进行创新

这是我发现的,可能适用于您,也可能不适用于您:

您是否打开了许多到表的连接,并且在完成时关闭了这些连接?如果您在Mapper或Reducer中执行扫描/获取,则在MR作业中可能会发生这种情况(如果可以避免,我认为您不希望这样做)

此外,如果我的映射器或减速器经常写入同一行,有时会遇到类似的问题。尝试分发写入或最小化写入以减少此问题


如果你详细了解你的MR工作性质,也会有所帮助。它有什么作用?您有示例代码吗?

结果表明,我达到了ZooKeeper的默认下限(我相信在更新的版本中已经增加了该上限)。我曾尝试在hbase-site.xml中设置更高的限制:

<property>
  <name>hbase.zookeeper.property.maxClientCnxns</name>
  <value>35</value>
</property>

作业现在可以运行数小时,my ZK client list在12个条目处达到峰值。

检查以下参数:

zookeeper会话超时(zookeeper.session.timeout)-->尝试增加并检查

zookeeper ticktime(ticktime)->增加并测试

检查ulimit(针对运行hadoop/hbase的用户的linux命令检查)的详细信息

在ulimit情况下,必须将followin参数设置为更高的值

打开的文件使这个值达到32K或更多

最大用户进程使其成为无限制的

进行这些更改后,请验证最有可能出现的错误
# can put this number much higher if desired
maxClientCnxns=35