2012-06-27 40 views
6

我在本地机器(伪分布式)上运行Hadoop MapReduce作业,该作业读取和写入HBase。我间歇性地收到一个错误,这会干扰作业,即使计算机处于独立状态而没有其他重要进程在运行 - 请参阅下面的日志。从作业后的ZooKeeper转储输出已经去世这个样子的,与客户失败后运行数增长:ConnectionLoss for/hbase +连接重置由同级?

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 
+0

我见过的连接丢失时后出现给定机器的IO太多了。你可能会咬掉你的机器上的hbase/zookeeper/hadoop M/R和其他东西。你有神经节安装吗?它可能会显示您使用了多少处理程序,以及是否正在打IO墙或抖动。 – Mike

+0

初始描述的一项修正:在作业失败后,客户端连接的数量并未永久增加。根据HBase Jira上描述的错误,如果作业成功完成,我可能会看到这种情况。 – Cyranix

+0

@Mike我并不是真的在同一时间运行任何其他重要结果的过程,但这是一个聪明的想法,可以监视系统资源。幸运的是,我的机器似乎足够完成手头的任务。 – Cyranix

回答

1

我以前遇到类似问题。大量的时间使用HBase/Hadoop,你会看到错误信息,这些信息并不指出你正在遇到的真正问题,所以你必须对它有创意。

这是我发现,它可能会或可能并不适用于您:

你打开很多连接到一个表,并完成,当你关闭它们?如果您在Mapper或Reducer中执行扫描/获取(如果可以避免,我不认为您想这样做),这可能发生在MR作业中。

此外,如果我的Mapper或Reducer写入同一行很多,有时我会得到类似的问题。尝试分发写入或最小化写入以减少此问题。

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

+0

这是一个使用OpenNLP的分词器从文档的中等语料库生成非常大的句子语料库的工作。每个句子在输出表中都有它自己的行,因为源文档也在HBase表中,所以我只设置一个Scan,并使用TableMapReduceUtil设置作业以使用Scan,我的TableMapper的子类(它生成Puts)和IdentityTableReducer。然而,当使用TableOutputFormat时,有一个与ZK连接泄漏有关的Jira问题,所以我认为这就是我所反对的。 – Cyranix

2

原来,我达到了ZooKeeper的低默认限制(我相信它已经在更新的版本中增加了)。我曾试图设置在HBase的-site.xml中更高的极限:

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

但它似乎没有工作,除非它是在zoo.cfg规定(也):

# can put this number much higher if desired 
maxClientCnxns=35 

的作业现在可以运行几个小时,我的ZK客户端列表最多可以输入12个条目。

0

检查下列参数:

饲养员会话超时(zookeeper.session.timeout) - >尽量增加和检查

饲养员滚动时间(滚动时间) - >增加和测试

检查对于ulimit(linux命令检查您运行hadoop/hbase的用户)具体情况

在ulimit的情况下,您必须将followin参数的值稍微调高一些。

打开的文件,使这个有点32K以上

最大用户进程,让这个无限的

做这些改变验证最有可能的错误将会消失