美文网首页
hadoop-env.sh文件研究

hadoop-env.sh文件研究

作者: Moon_魔宽 | 来源:发表于2019-05-05 23:31 被阅读0次

版权声明:本文为博主原创文章,未经博主允许不得转载。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% 需要调整xmnSurvivorRatior值。


写这篇文章的初衷,是在于datanode节点启动后,通过ps -ef看到的datanode进程在启动jvm时,打印了多遍jvm配置参数(正常应该只打一遍)。Ambari平台在HDFSconfig->advanced上关于hadoop-env.sh的配置中,不应当添加“export”。

相关文章

网友评论

      本文标题:hadoop-env.sh文件研究

      本文链接:https://www.haomeiwen.com/subject/lrxloqtx.html