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工具。
|