2012-03-14 53 views
4

我目前正在研究一個項目,我需要爲我的地圖任務建立一個內存結構。我做了一些計算,我可以說,我不需要每個地圖任務超過600MB的內存。 但事情是,過了一段時間,我有Java堆空間問題或GC開銷限制。我不知道這怎麼可能。Hadoop:堆空間和gc問題

這裏是一些更多的細節。我有兩個四核系統,內存爲12GB。這意味着我最多可以同時運行8個地圖任務。我正在構建一棵樹,所以我有一個迭代算法,爲每個樹級執行map-reduce作業。我的算法適用於小數據集,但對於中等數據集有堆空間問題。我的算法達到某個樹級別,然後它離開堆空間,或者有gc開銷問題。在那一點上,我做了一些計算,我看到每個任務都不需要超過100MB的內存。所以對於8個任務,我使用了大約800MB的內存。我不知道發生了什麼事。我甚至用這些行更新了我的hadoop-env.sh文件:

export HADOOP_HEAPSIZE=8000 
    export HADOOP_OPTS=-XX:+UseParallelGC 

什麼問題?這些行甚至會覆蓋我的系統的java選項嗎?使用parallelGC是我在互聯網上看到的東西,在有多個內核時推薦使用。

 edits 

確定這裏有一些編輯後,監視堆空間和總內存。 同時運行6個任務時,我消耗了大約3500MB的RAM。這意味着jobtracker,tasktracker,namenode,datanode,secondary namenode我的操作系統和6個任務都使用3500個RAM,這是一個非常合理的大小。那麼,爲什麼我得到一個gc開銷限制? 我對每個樹級都遵循相同的算法。唯一改變的是每個樹級的節點數量。在樹級別有許多節點,不會爲我的算法增加太多開銷。那麼爲什麼gc不能很好地工作?

+0

請問您可以發佈您的地圖並減少方法嗎? – darijan 2012-03-14 14:04:09

+0

我可以,但他們有點複雜。在這裏發佈我的代碼會很混亂。如果你仍然想看到它,請再次問我 – jojoba 2012-03-14 14:08:14

回答

5

如果最大內存大小沒有變化,它將是主內存的1/4,即大約3 GB,另外一些非堆使用的開銷可能是3.5 GB。

我建議你嘗試

export HADOOP_OPTS="-XX:+UseParallelGC -Xmx8g" 

最大內存設置爲8 GB。


默認情況下,最大堆大小是內存的1/4(除非在Windows上運行32位JVM)。所以如果最大堆大小被忽略,它仍然是3 GB。

無論您使用一個GC還是另一個GC,當內存不足時都不會有太大的區別。

我建議你用-XX:+HeapDumpOnOutOfMemoryError進行堆轉儲,並在一個分析器中讀取這個數據。 VisualVM看看爲什麼它使用了這麼多的內存。

+0

我使用的是Fedora 12 consantine 64位。我把這個命令放在HADOOP_OPTS中? – jojoba 2012-03-14 14:10:50

+0

是的,你這樣做...... – 2012-03-14 14:13:45

+0

也可以在程序運行時運行VisualVM來查看正在使用多少內存。 – 2012-03-14 14:14:25