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