hadoop-叢集管理(2)——記憶體設定
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 2 Day DBA-管理Oracle例項-管理記憶體-修改記憶體設定-自動記憶體管理Oracle記憶體
- hadoop-叢集管理(1)——配置檔案Hadoop
- hadoop-叢集管理(4)——關鍵屬性Hadoop
- hadoop-叢集管理(3)——不常用引數Hadoop
- Hadoop-叢集執行Hadoop
- 管理 ES 叢集:分片設定及管理
- CDH叢集調優:記憶體、Vcores和DRF記憶體
- oracle 11G 自動記憶體管理設定Oracle記憶體
- 記憶體管理 記憶體管理概述記憶體
- 2 Day DBA-管理Oracle例項-管理記憶體-關於記憶體管理Oracle記憶體
- JVM堆記憶體設定JVM記憶體
- Tomcat記憶體設定Tomcat記憶體
- 檢視Redis叢集所有節點記憶體工具Redis記憶體
- Linux 記憶體管理: Kmalloc(2)Linux記憶體
- 自動共享記憶體管理 自動記憶體管理 手工記憶體管理記憶體
- mongodb 分片叢集設定MongoDB
- 記憶體管理篇——實體記憶體的管理記憶體
- 設定SQLserver執行記憶體SQLServer記憶體
- JVM 堆記憶體設定原理JVM記憶體
- jvm記憶體設定及記憶體溢位、解決方案JVM記憶體溢位
- 【記憶體管理】記憶體佈局記憶體
- Linux 記憶體管理 pt.2Linux記憶體
- oracle 11G 自動記憶體管理設定修改為手功管理Oracle記憶體
- 記憶體管理記憶體
- 高階記憶體管理程式設計指南-實用的記憶管理記憶體程式設計
- 記憶體管理兩部曲之實體記憶體管理記憶體
- eclipse設定JVM記憶體堆EclipseJVM記憶體
- Oracle:記憶體設定注意事項Oracle記憶體
- eclipse中設定JVM記憶體EclipseJVM記憶體
- ActiveMQ記憶體設定和流控MQ記憶體
- eclipse.ini記憶體設定Eclipse記憶體
- 11g記憶體的設定記憶體
- linux 設定預留記憶體Linux記憶體
- Go:記憶體管理與記憶體清理Go記憶體
- Java的記憶體 -JVM 記憶體管理Java記憶體JVM
- Aerospike的bin記憶體管理--即列記憶體管理ROS記憶體
- Sql Server實體記憶體及虛擬記憶體設定的總結SQLServer記憶體
- MIT6.828 Lab2 記憶體管理MIT記憶體