2012-01-23 37 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文件中發現錯誤。