当前位置: > Linux集群 > Hadoop >

hadoop 优化0

时间:2014-12-21 19:34来源:linux.it.net.cn 作者:IT

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工具来监控集群的内存信息。

(责任编辑:IT)
------分隔线----------------------------