当前位置:首页 > 大数据 > Hadoop > 正文内容

Hadoop-JVM调优

下辈子别做运维2022-05-05 12:28:16Hadoop

1、Yarn基础知识

图片1.png

ResourceManager:主节点,主要负责接收用户提交的任务请求,进行资源分配。

NodeManager:从节点,主要负责接收和执行ApplicationMaster分配的任务。

 

ApplicationMaster:每提交一个任务给ResourceManager,ResourceManager就会在从节点上启动一个AppMaster,负责任务的分配和资源的申请,将任务执行情况汇报给ResourceManager等。

 

Container:资源分配的单位,ApplicationMaster申请到的资源都分配给一个个的container,然后再一个个的container中运行一个个maptask或者reducetask。

 

JobHistory:历史完成任务的界面查看。

 

MR on YARN 执行流程

 

用户向yarn提交job,其中包含application master程序,启动application master的命令等。

 

RM 为该 job 分配第一个 container,与对应的 NM 通信,要求它在这个 container 启动作业的ApplicationMaster。

 

ApplicationMaster向 applications manager 注册,这样用户就可以通过 RM Web 查看 job 的状态。

 

ApplicationMaster 采用轮询的方式通过 RPC 协议向 resource scheduler 申请和领取资源

 

一旦 ApplicationMaster 申请到资源后,与对应的 NM 通信,要求启动task。

 

NM 为任务设置好运行环境后,将任务的启动命令写到一个脚本中,并通过该脚本启动、运行任务。

 

各个任务 task 通过rpc协议汇报自己的状态和进度,以便让ApplicationMaster随时掌握各个任务的运行状态,从而在任务失败时,重启启动任务。

 

job 运行完成后,ApplicationMaster 向 applications manager 注销并关闭自己。


2Hadoop内存堆大小

默认Hadoop为各个守护进程配备1000MB初始化堆内存大小,一般是在hadoop-env.sh中配置HADOOP_HEAPSIZE。也可以在yarn-env.sh配置YARN_RESOURCEMANAGER_HEAPSIZE修改单个守护进程的堆大小,如果在yarn中配置,那么会覆盖掉hadoop-env.sh中设置的值。

守护进程内存大小配置计算公式:

节点数*每台机器的磁盘空间/(数据块大小*复本数)

例:一个Hadoop集群中有100台机器,每台机器有300GB空间,数据块大小每台128MB,复本数3

计算:100*307200MB/(128MB*3)=80000MB

即为守护进程分配80000MB内存

 

向namenode分配的内存大小由HADOOP_NAMENODE_OPTS参数控制,生产情况,NN和RM一般是部署在一台机器上的,一般分配8G的内存,根据集群规模可适当调大。

配置范例:

HADOOP_NAMENODE_OPTS=-Xmx8192m

其他参数:

HADOOP_SECONDARYNAMENODE_OPTS,针对SecondaryNameNode的特殊的JVM参数的配置。

HADOOP_NAMENODE_INIT_HEAPSIZEnamenode初始内存大小,默认1000MB

HADOOP_DATANODE_OPTS,配置datanode的内存大小

 

查看namenode及datanode的内存大小

先用jps查看namenodedatanode进程pid

命令:jmap -heap 46358pid

图片2.png

MaxHeapSize即为分配的namenodedatanode内存大小

注意:jmap在执行-heap时会触发STW,影响正常服务,在生产环境下的一般情况请谨慎使用。


3JVM重用

默认情况下,TaskTracker将每个MapperReducer任务作为子进程运行在独立的JVM中,每个任务的运行时间很短,而每个任务又会引入JVM的启动开销,如果涉及到Mapper初始化:如将数据读到内存中,那么初始化的时间会很长。基于这种情况,可以启用HadoopJVM重用,使得启动开销分配到多个任务中。

启用JVM重用的配置参数是mapred.job.reuse.jvm.num.tasks,在mapre-site.xml文件中进行配置,设置为N,表示JVM可以启动N个数量的任务。默认值为1,此时JVM不能被重用,如果设置为-1,则表示JVM在启动任务数量上没有限制。

由于JVM重用会影响Hive的性能,特别是对于小文件的场景或者task特别多的场景,这类场景大多数执行时间都很短,所以也可在hive中进行设置,具体方法为在Hive的命令行中执行set  mapred.job.reuse.jvm.num.tasks=NN表示任务数量)指令。

为每个任务启动一个新的JVM将耗时1秒左右,对于运行时间较job影响不大,但如果都是时间很短的task,那么频繁启停JVM耗费一定的时间。一般来说,配置为8个任务数量即可。

Hive配置范例:

set  mapred.job.reuse.jvm.num.tasks=8

4Yarn配置

yarn-env.sh

关于YARN_RESOURCEMANAGER_HEAPSIZE的默认配置为1000MB,一般来说建议配置为8G

配置范例:

export YARN_RESOURCEMANAGER_HEAPSIZE=8192

 

关于YARN_NODEMANAGER_HEAPSIZE的默认配置为1000MB,一般来说建议配置为4G

配置范例:

YARN_NODEMANAGER_HEAPSIZE=4096

 

剩下的可用内存,配到  yarn.nodemanager.resource.memory-mb 中 ,表示该节点上YARN可使用的物理内存总量,默认为8G可向系统借一些,也可以看情况减少些。但需要注意的是,YARN不会自动检测节点的物理内存总量,所以该值的设置不能超过机器物理内存。

 

container内存的最小值默认为1G,配置方法如下,可根据生产作业大小情况适当调整:

参数:yarn.scheduler.minimum-allocation-mb

每台机子可用的RAM    container最小值

小于4GB       256MB

4GB到8GB之间     512MB

8GB到24GB之间     1024MB

24GB到128G之间     2048MB

128G以上       4096MB

 

container内存的最大值默认为-1,即分配8G,配置方法为:

参数:yarn.scheduler.maximum-allocation-mb

计算公式:yarn可用内存 / container内存的最大值 = 整数

每个 container 的最小大小,默认-1,即分配1G。一般设置为1G-2G即可。

参数:yarn.scheduler.minimum-allocation-mb

 

5、CPU方面的参数(vcore:虚拟core)

参数:yarn.nodemanager.resource.cpu-vcores

表示该节点上YARN可以使用的vcore个数,默认是8,建议在生产上调整为实际物理core个数的两倍,一个 16Cores 的机器,该值就设置为 32。按照当前总vcore*80%,不要把所有的vcore拿过来用。

参数:yarn.scheduler.minimum-allocation-vcores

单个任务可以使用的最小 vc 个数,默认为 1。vcore数量/最小VC个数,即得出最多可以跑多少个container。比如一个vcore数量设置为16,最小vc个数设置为1,那么最多可以跑16/1=16个的container。

参数:yarn.scheduler.maximum-allocation-vcores

单个任务可以使用的最大 vc 个数,默认为 4,vc个数无法自动扩展。根据cloudera公司的性能测试,如果该值设置为大于等于5的话,那么cpu的利用率不是很好。

 

6、案例

1、假定给定 64 G,16 Core 的机器,如何调整上面的参数达到资源最大化利用?

首先按照经验,可供使用的内存空间为 80% ~ 85%,这里使用 80% 计算,得到 51.2 G,大约50 G。

然后是最大 vc 数,cloudera公司推荐,一个container的vcore最好不要超过5,根据经验值最大设置为 4。

最小的内存需要根据业务情况,这里给定 2G。

通过最小内存可以计算出,50G 的内存最多可以分配 50 / 2 = 25 个 container,由于 vc 数最多只有 32 个,所以这里的最小 vc 数只能给 1,同时可以确定 vc 总数为 25 个。

如果考虑最大 vc 数,25 个 vc 最多能分配 6 个 container,由于总的可分配内存是50G,所以最大内存为 50 / 6 = 8G。

通过估算后以下几个参数如下

 

yarn.nodemanager.resource.memory-mb:51200

yarn.nodemanager.resource.cpu-vcores:25

yarn.scheduler.minimum-allocation-mb:2048

yarn.scheduler.minimum-allocation-vcores:1

yarn.scheduler.maximum-allocation-mb:8192

yarn.scheduler.maximum-allocation-vcores:4

 

2、环境假设:128Gmemory 16物理core,32vc

装完CentOS,消耗内存1G,系统预览15%-20%内存,以防全部使用导致系统夯住 和 oom机制事件,或者给未来部署组件预览点空间。此外,本机器还有DN和NM两个进程分别占用2G和4G内存。

预留内存:128*20%=25.6G ==26G

剩余内存:128-26-2-4=96G

yarn.nodemanager.resource.memory-mb 96G

yarn.scheduler.minimum-allocation-mb 1G 极限情况下,只有96个container 内存1G

yarn.scheduler.maximum-allocation-mb 96G 极限情况下,只有1个container 内存96G

 

container的内存会自动增加,默认1G递增

container:1-96个

 

 

yarn.nodemanager.resource.pcores-vcores-multiplier 2

yarn.nodemanager.resource.cpu-vcores 32

yarn.scheduler.minimum-allocation-vcores 1 极限情况下,只有32个container

yarn.scheduler.maximum-allocation-vcores 32 极限情况下,只有1个container

container:1-32个

 

确定 vcore=4 那么container =32/4=8个

yarn.nodemanager.resource.memory-mb 96G

yarn.scheduler.minimum-allocation-mb 1G

yarn.scheduler.maximum-allocation-mb 12G 极限container 8个

yarn.nodemanager.resource.cpu-vcores 32

yarn.scheduler.minimum-allocation-vcores 1

yarn.scheduler.maximum-allocation-vcores 4 极限container 8个

 

8个container 12G 4vcore

 

yarn.nodemanager.resource.memory-mb 96G

yarn.scheduler.minimum-allocation-mb 1G

yarn.scheduler.maximum-allocation-mb 8G

 

12container 12*2=24

 

yarn.nodemanager.resource.cpu-vcores 32

yarn.scheduler.minimum-allocation-vcores 1

yarn.scheduler.maximum-allocation-vcores 2

16 container*8g




扫描二维码推送至手机访问。

版权声明:本文由个人博客发布,如需转载请注明出处。

本文链接:https://opszzfwordpress.club/post/28.html

分享给朋友:

“Hadoop-JVM调优” 的相关文章

Hadoop操作

Hadoop操作

1、Hadoop控制启动:hdfs:/hadoop/hadoop-2.7.7/sbin/start-...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。