hadoop集羣內存設置

 





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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章