我目前正在研究一個項目,我需要爲我的地圖任務建立一個內存結構。我做了一些計算,我可以說,我不需要每個地圖任務超過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不能很好地工作?
請問您可以發佈您的地圖並減少方法嗎? – darijan 2012-03-14 14:04:09
我可以,但他們有點複雜。在這裏發佈我的代碼會很混亂。如果你仍然想看到它,請再次問我 – jojoba 2012-03-14 14:08:14