1.hadoop-env.sh:该文件用来配置hadoop所需的特殊环境变量:
JAVA与HADOOP环境变量的设置(如果在~/.bash_profile中设置了环境变量,这里可以不进行配置)
export JAVA_HOME=/home/admin/deploy/java6
export HADOOP_HOME=/home/admin/deploy/hadoop-0.20.2
# The maximum amount of heap to use, in MB. Default is 1000.# export HADOOP_HEAPSIZE=2000
JAVA虚拟机性能调优(省略不用修改的内容)
HADOOP_NAMENODE_OPTS="-Xmx2048m–Xms1024m -Xmn1024m
HADOOP_DATANODE_OPTS="-Xmx2048m–Xms1024m -Xmn1024m
HADOOP_JOBTRACKER_OPTS="-Xmx2048m–Xms1024m -Xmn1024m
补充解释:
HADOOP_HEAPSIZE 这个参数是每一个守护线程分配多少内存,因为namenode 把数据放到内存,所以会造成较大的内存开销,所以一般要单独为namenode配 置内存使用 HADOOP_NAMENODE_OPTS 参数。
这里的XMS与XMX指的是JAVA虚拟机内存分配策略中的最大可用内存和最小内存设置。
不建议将XMS与XMX设置成一样。因为java的垃圾回收器在内存使用达到XMS值的时候才会开始回收,如果2个值一样,那么JAVA会在使用完所有内存时才会回收垃圾,导致内存LOAD一直很高。
关于XMN这个参数是JAVA内存机制中的年轻代。
整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。
持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。这里为了便于计算, 取整个堆的一半。
另外:如果JAVA内存设置过大,HADOOP启动会报错 Error occurred during initialization of VM,Could not reserve enough space for object heap |
2.内存、任务数与cpu个数的关系。
在mapred-site.xml配置文件中设置
mapred.tasktracker.map.tasks.maximum 默认2 每个tasktracker 最多运行的tasks数目
mapred.tasktracker.reduce.tasks.maximum 默认2 每个tasktracker最多运行的reduce数目
mapred.child.java.opts 默认-Xmx200m 每个任务分配多少内存
那么如下表:
如果HADOOP_HEAPSIZE 取默认值,那么datanode tasktracker等守护线程均分别占1000m内存。默认每个tasktracker运行2个map和2个reduce任务。那么总共的
内存开销是2800m
那么对于多处理器而言,任务数和cpu数之间的关系,在hadoop权威指南上指出 。经验值是 :任务数/cpu数目 在1~2之间。
比如具有8个cpu的机器,那么总任务数,就不能超过16,因为slave节点上的datanode 和tasktracker 也有进程开销。
原则就是,在考虑分配多少任务数时,要考虑同时运行在这台节点上的其他进程。
可以使用ganglia工具来监控集群的内存信息。
该贴被蜀山战纪编辑于2015-12-4 9:54:03