hadoop-叢集管理(2)——記憶體設定

thamsyangsw發表於2014-08-19

1. 記憶體

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

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

2. 最大map任務數

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

3. 最大reduce任務數

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

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

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

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

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

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

在一個tasktracker上能夠同時執行的任務數取決於這臺機器上有多少個處理器。由於mapreduce作業通常是I/O-bound,因此將任務數設定為超出處理器數也有一定道理,可以獲得更好的利用率。經驗法則是任務總數(map任務數與reduce任務數之和)與處理器的比值在1和2之間。

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

這樣配置是否合理,還需要考慮是否給這臺機器上的其他程式預留了足夠記憶體,否則可能導致各程式在系統中不斷切換,導致效能惡化。可以使用一些工具來監控叢集的記憶體使用情況來進行最佳化,例如Ganglia工具。

hadoop也可以設定mapreduce操作所能使用的最大記憶體量,這是分別針對各項作業進行設定的。(詳見《hadoop權威指南》117頁的“shuffle和排序”小節)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26613085/viewspace-1253878/,如需轉載,請註明出處,否則將追究法律責任。

相關文章