2012-01-23 35 views
3

我有一个运行hadoop 0.20.203.0的4节点(master + 3 slave)集群。每隔几天,datanode就会在主服务器上报失效。在从服务器上,一切正常,datanode进程仍在运行,尽管日志中不再有任何请求,但在日志中没有任何可疑内容。在主设备上,日志显示datanode心跳已丢失。Hadoop数据节点停止报告

唯一的解决方案是手动停止datanode,然后再次启动它。几分钟后,datanode再次报告为活动。

有没有其他人经历过这个?如果是的话,原因是什么,解决方案是什么?

+0

听起来像你可能会遇到网络硬件故障。你一次或多次失去一个奴隶吗?另外,您是否在EC2或其他虚拟化环境中? –

+0

在我们自己的服务器上运行直接硬件。什么让你知道它可能是网络硬件相关的线索?我可以打开某种日志记录来判断datanode是否认为它正在发送心跳?数据节点能否处于一种糟糕的状态,并放弃尝试发送心跳信号? –

+0

对不起,忘了提及,我们一次失去一个。希望我们的监测能够注意到它,并在下一个做同样的事情之前重新启动它。 –

回答

3

我们有类似的问题,对我们来说,抒情是增加打开文件的限制。

尝试添加这样一行ulimit -n 4096到文件hadoop-env.sh

+0

谢谢,但我们的ulimit已经设置非常高:'ulimit -n 1048576' –

+0

事实上,它看起来像这样,再加上另一个bug是我们问题的原因。我们的配置搞砸了,有些节点的ulimit较低(0124) –

2

有两个问题。

1)上面的Tomas建议的根本问题是打开的文件限制设置不正确。

2)次要问题在于错误处理和报告。这在hadoop错误数据库Datanode is marked dead, but datanode process is alive and verifying blocks中描述。

当发送心跳到namenode的线程失败时,它没有恢复正常。 a)不再有心跳尝试,也没有导致整个datanode关闭。 b)它向stderr或stdout报告错误,它通常进入一个.out文件而不是通过log4j,这对通常的.log文件是这样做的(我忘记了.out文件甚至存在,所以我没有在那里检查。)

0

在我们的案例中,它是由于OutOfMemoryError而发生的。我们在数据节点.out文件中发现错误。