2014-02-21 49 views
0

我們有一個非常令人沮喪的Hadoop流內存不足的問題,我們的設置:的Hadoop 2.2.0流內存限制

  • 的Hadoop 2.2.0(紗)
  • 我們的計算節點有關於7 GB的RAM
  • 的hadoop streaming開始bash腳本至極使用約4 GB的RAM
  • 因此只可能開始一個和每個節點只一個任務

開箱即用每個hadoop實例啓動大約7個hadoop容器,默認hadoop設置。每個hadoop任務都會派生一個需要大約4 GB RAM的bash腳本,第一個分支可以工作,所有跟隨失敗,因爲他們耗盡內存。所以我們正在尋找的是限制容器數量只有一個。所以我們發現在互聯網上:

  • yarn.scheduler.maximum-allocation-mbmapreduce.map.memory.mb設置爲值,使得至多有一個容器。這意味着,mapreduce.map.memory.mb必須是的最大內存的一半以上(否則會有多個容器)。

做得不錯,這給了我們每節點一個容器。但它產生了一個新問題:由於我們的java進程現在至少使用了最大內存的一半,所以我們的子進程(bash)將會繼承父內存空間,並且由於我們父級使用的內存超過了一半的內存總量,我們再次耗盡內存。如果我們降低地圖內存,hadoop將爲每個節點分配2個容器,這也將耗盡內存。

我們將非常樂意爲您提供任何幫助!謝謝!

編輯:由於這個問題是我們項目中的攔截器,我們正在評估調整源代碼來解決這個問題。

回答

1

看來,解決的辦法是設置爲通過Hadoop的孩子的初始內存佔用:

<property> 
    <name>mapreduce.map.child.java.opts</name> 
    <value>-Xmx512</value> 
</property> 

,我們還設置以下參數的值相同,只是要確定(它們設置子堆大小進程):

yarn.app.mapreduce.am.command-opts 

它設置MR App主進程堆大小。

可以通過上述模式設置hadoop容器的數量。重要的是要注意:必須至少有mapreduce.map.child.java.opts的數量可以自由生成子進程。我們使用:

mapreduce.map.memory.mb = yarn.scheduler.maximum-allocation-mb - mapreduce.map.child.java.opts 

現在一切都平穩地工作。希望這可以幫助未來的人!