2012-11-02 95 views
2

我很困惑hadoop namenode內存問題。Hadoop namenode內存使用情況

  1. 當NameNode的內存使用率低於一定比例較高(比如75%),閱讀和通過Hadoop的API編寫HDFS文件會失敗(例如,調用一些open()將拋出異常),什麼是原因?有沒有人有同樣的事情? PS。此時namenode盤io不高,CPU相對空閒。

  2. 什麼決定了namenode'QPS(每秒查詢)?

非常感謝!

回答

1

由於名稱節點基本上是一個RPC服務器管理與塊HashMap,你有兩個主要的內存問題:

  1. 的Java HashMap是相當昂貴的,它的衝突解決(單獨的鏈接算法)是昂貴的好吧,因爲它將碰撞的元素存儲在鏈表中。
  2. RPC服務器需要的線程來處理請求 - Hadoop的船舶用自己的RPC框架,你可以用dfs.namenode.service.handler.count的數據節點它被默認設置爲10或者,您可以配置此dfs.namenode.handler.count爲其他客戶配置此,像MapReduce作業,JobClients,想要運行一項工作。當請求進入並且它想要創建一個新的處理程序時,它可能會出現內存不足(新的線程也分配了一大堆棧空間,也許你需要增加這個空間)。

所以這些就是爲什麼你的namenode需要這麼多記憶的原因。

What determines namenode'QPS (Query Per Second) ? 

我還沒有對它進行基準測試,所以我不能給你很好的提示。當然,微調處理程序計數要高於可並行運行的任務數+推測執行。 根據您提交工作的方式,您還必須微調其他屬性。

當然,你應該給namenode總是足夠的內存,所以它有空間不會陷入完整的垃圾收集週期。

+0

謝謝,我設置dfs.namenode.handler.count = 8000,根據你的答案,它會花費namnode 8000 * 2M(假設一個線程花費2M)?另一件事,爲什麼讀寫hdfs文件失敗時namenode內存使用率> 75%?我想不出一個理由 –

+0

你一般不能這麼說,但是至少使用1mb堆棧,2mb是我相信的一個好上限。 –

+0

我寫了一個程序,需要從hdfs中獲取很多文件,當namonode內存使用率> 75%時,它會發現許多文件不能從hdfs獲得 –