hadoop1.0 記憶體關係

jss001發表於2014-03-08

 <wbr>

1. 記憶體

hadoop為各個守護程式(namenode,secondarynamenode,jobtracker,datanode,tasktracker)統一分配的記憶體在hadoop-env.sh中設定,引數為HADOOP_HEAPSIZE,預設為1000M。

大部分情況下,這個統一設定的值可能並不適合。例如對於namenode節點,1000M的記憶體只能儲存幾百萬個檔案的資料塊的引用。如果我想單獨設定namenode的記憶體,可以透過HADOOP_NAMENODE_OPTS來設定。

export Hadoop_NAMENODE_OPTS="-Xmx15360m -Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS"

同樣的,可以透過HADOOP_SECONDARYNAMENODE_OPTS來設定secondrynamenode的記憶體,使得它與namenode保持一致。

當然,還有HADOOP_DATANODE_OPTS、HADOOP_BALANCER_OPTS、HADOOP_JOBTRACKER_OPTS變數供你使用。

此外,tasktracker啟動獨立的子JVM以執行map和reduce任務,分配給每個子JVM的記憶體量由mapred.child.java.opts屬性(mapred-site.xml)控制,預設值為200M。

 <wbr>

2. 最大map任務數

一個tasktracker能夠同時執行最大map任務數,由mapred.tasktracker.map.tasks.maximum屬性(mapred-site.xml)控制,預設為2。

 <wbr>

3. 最大reduce任務數

一個tasktracker能夠同時執行最大reduce任務數,由mapred.tasktracker.reduce.tasks.maximum屬(mapred-site.xml)性控制,預設為2。

Reduce任務的個數

正確的reduce任務的 個數應該是0.95或者1.75 ×(節點數 ×mapred.tasktracker.tasks.maximum引數值)。如果任務數是節點個數的0.95倍,那麼所有的reduce任務能夠在 map任務的輸出傳輸結束後同時開始執行。如果任務數是節點個數的1.75倍,那麼高速的節點會在完成他們第一批reduce任務計算之後開始計算第二批 reduce任務,這樣的情況更有利於負載均衡。
目前reduce任務的數量 由於輸出檔案緩衝區大小(io.buffer.size × 2 ×reduce任務個數 << 堆大小),被限制在大約1000個左右。直到能夠指定一個固定的上限後,這個問題最終會被解決。

 <wbr>

4. 小總結:計算節點的記憶體佔用量。

 <wbr>

預設情況下,一個同時執行了namenode,secondarynamenode和jobtracker的主節點,各自使用1000M記憶體,所以總計使用3000M。

預設情況下,一個從節點執行了如下守護程式:

  • 1個datanode:預設佔用1000M記憶體。
  • 1個tasktracker:預設佔用1000M記憶體。
  • 最多2個map任務:2*200M=400M。
  • 最多2個reduce任務:2*200M=400M。

即預設情況下,一個從節點需要使用2800M記憶體量。

例如,假設一臺8個處理器的工作節點,每個處理器上執行2個程式,則可以將最大map任務數和最大reduce任務數分別設定成7(因為還有datanode和tasktracker程式,所以不能設定為8),各個JVM子任務可用記憶體設定為400M,則總記憶體開銷=1000M(datanode)+1000M(tasktracker)+7*400M(map)+7*400M(reduce)=7600M

 <wbr>

關於task記憶體配置有如下3個選項:

每個任務呼叫記憶體大小

  • mapred.child.java.opts
  • mapred.map.child.java.opts
  • mapred.reduce.child.java.opts
  • 通常我們會配置“mapred.child.java.opts”,但其實這個配置已經deprecated,卻而代之的是:mapred.map.child.java.opts和mapred.reduce.child.java.opts兩個配置,詳情大家見JobConf類、

 <wbr>

<!-- 正文結束 --&gt

相關文章