版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.jianshu.com/p/60596b4c53a9
该文件的主要是配置hadoop的环境变量。例如守护进程的JVM启动参数:java堆大小和垃圾回收策略等。在这个文件中还可以设置HBase配置文件的目录、日志目录、SSH选项、进程pid文件的目录等。
# Set Hadoop-specific environment variableshere.
# The only required environment variable isJAVA_HOME. All others are
# optional. When running a distributed configuration it is best to
# set JAVA_HOME in this file, so that it is correctly defined on
# remote nodes.
export JAVA_HOME=”/usr/java/实际jdk路径”
JAVA_HOME是必须设置的,即使我们当前的系统中设置了JAVA_HOME,它也是不认识的,因为Hadoop即使是在本机上执行,它也是把当前的执行环境当成远程服务器。
export HADOOP_CLASSPATH=
# Extra Java CLASSPATH elements. 这个环境变量是hadoop执行程序时会查询class的路径。
这个是可选的。
export HADOOP_HEAPSIZE=2000
# The maximum amount of heap to use, in MB.Default is 1000.
hadoop为各个守护进程(namenode,secondarynamenode,jobtracker,datanode,tasktracker)统一分配的内存,默认为1000M。大部分情况下,这个统一设置的值可能并不适合。可以单独设置namenode的内存,通过HADOOP_NAMENODE_OPTS来设置。同样的,可以通过HADOOP_SECONDARYNAMENODE_OPTS来设置secondrynamenode的内存,使得它与namenode保持一致。以及HADOOP_DATANODE_OPTS、HADOOP_BALANCER_OPTS、HADOOP_JOBTRACKER_OPTS变量等等。
# Extra Java runtime options. Empty
by default. java的运行选项,有默认值export HADOOP_OPTS=-server
Hadoop启动时的JVM参数,默认是以server模式启动,后面可以跟-X或-XX之类的参数。
export HADOOP_NAMENODE_OPTS=
该选项的值会附加(覆盖)到HADOOP_OPTS之后,在启动NameNode时设置的JVM参数。
export HADOOP_SECONDARYNAMENODE_OPTS=
该选项的值会附加(覆盖)到HADOOP_OPTS之后,在启动SECONDNameNode时设置的JVM参数。
export HADOOP_DATANODE_OPTS=该选项的值会附加到HADOOP_OPTS之后,在启动DataNode时设置的JVM参数。
如想手动设置Datanode的堆、垃圾回收等信息,可以这样设置:export HADOOP_DATANODE_OPTS="-Xmx2g -XX:+UseParallelGC${HADOOP_NAMENODE_OPTS}" 其它的服务设置类似。
# The directory where pid files are stored./tmp by default.
# NOTE: this should be set to a directorythat can only be written to by
# the users that are going to run the hadoop daemons. Otherwise there is
# the potential for a symlink attack.
export HADOOP_PID_DIR=/var/hadoop/pids
Hadoop PID文件的存放目录,这个最好是修改一下,因为/tmp目录通常来说是任何人都可以访问的,有可能存在符合链接攻击的风险。
参数示例:
HADOOP_OPTS
-Djava.net.preferIPv4Stack=true
优先使用IPV4,禁用IPV6
HADOOP_NAMENODE_OPTS
-Xms16384m //初始堆内存大小
-Xmx16384m //最大堆内存大小
-XX:NewRatio=3 //设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=3 //年轻代中Eden区与两个Survivor区的比值。其中Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5。
-XX:MaxPermSize=200M 设置年老代大小
-XX:+UseParallelGC
//指定在年轻代使用 parallel
collector, 并行收集 , 暂停 app threads, 同时启动多个垃圾回收 thread, 不能和 CMS gc 一起使用。
-XX:+UseParNewGC
//指定在年轻代使用 parallel
collector, 是 UseParallelGC 的 gc 的升级版本 , 有更好的性能或者优点 , 可以和 CMS gc 一起使用。
-XX:+UseConcMarkSweepGC //使用CMS内存收集
-XX:CMSInitiatingOccupancyFraction=70 //使用70%后开始CMS收集
-XX:ConcGCThreads=8
-XX:+PrintGCDetails //打印GC详情
-XX:+PrintGCDateStamps //打印GC时间戳
-Xloggc:/tmp/namenode.gc.log //gc日志的目录及文件名
HADOOP_DATANODE_OPTS
-Xms8G//初始堆内存
-Xmx8G//最大堆内存
-Xmn512M//设置年轻代大小
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:MaxDirectMemorySize=512M//
此参数的含义是当Direct ByteBuffer分配的堆外内存到达指定大小后,即触发Full GC
CMSInitiatingOccupancyFraction值与Xmn的关系公式
网上有文章介绍了在采用cms收集器时,为避免发生full gc,
CMSInitiatingOccupancyFraction与xmn需满足的一个关系:
CMSInitiatingOccupancyFraction<=((Xmx-Xmn)-(Xmn-Xmn/(SurvivorRatior+2)))/(Xmx-Xmn)*100
例如:
当xmx=128 xmn=36 SurvivorRatior=1时CMSInitiatingOccupancyFraction<=((128.0-36)-(36-36/(1+2)))/(128-36)*100=73.913
当xmx=128 xmn=24 SurvivorRatior=1时CMSInitiatingOccupancyFraction<=((128.0-24)-(24-24/(1+2)))/(128-24)*100=84.615…
当xmx=3000 xmn=600 SurvivorRatior=1时CMSInitiatingOccupancyFraction<=((3000.0-600)-(600-600/(1+2)))/(3000-600)*100=83.33
CMSInitiatingOccupancyFraction低于70% 需要调整xmn或SurvivorRatior值。
写这篇文章的初衷,是在于datanode节点启动后,通过ps -ef看到的datanode进程在启动jvm时,打印了多遍jvm配置参数(正常应该只打一遍)。Ambari平台在HDFS的config->advanced上关于hadoop-env.sh的配置中,不应当添加“export”。














网友评论