yarn资源调优参数
概念介绍
- container
是一个虚拟化的容器,包括memory和vcore两个维度,作用是运行appmaster和task任务 - 物理核pcore
服务器上实际的物理CPU的核数 - 虚拟核vcore
yarn引入的一个概念,设计的初衷是考虑到每台服务器的性能不一样,比如某一个物理CPU是另一个物理CPU的两倍,通过设置pcore和vcore来弥补这种差距
比如第一台机器CPU性能强悍,设置pcore:vcore=1:2
第二台机器CPU性能比较差,设置pcore:vcore=1:1
生产上如何调优
内存参数
在yarn-site.xml中进行配置
key | value | desc |
---|---|---|
yarn.nodemanager.resource.memory-mb | -1 | 可以分配给容器的物理内存总量(以MB为单位) |
yarn.scheduler.minimum-allocation-mb | 1024 | 单个container向RM能申请到的最小内存 |
yarn.scheduler.maximum-allocation-mb | 8192 | 单个container向RM能申请到的最大内存 |
cpu参数
在yarn-site.xml中进行配置
key | value | desc |
---|---|---|
yarn.nodemanager.resource.pcores-vcores-multiplier | 1 | 将pcore转化为vcore的乘数,若为2,表示pcore*2=vcore。推荐pcore:vcore=1:2 |
yarn.nodemanager.resource.cpu-vcores | -1 | 所有conatiner能使用的物理内存总和 |
yarn.scheduler.minimum-allocation-vcores | 1 | 单个container向RM能申请到的最小vcore数量 |
yarn.scheduler.maximum-allocation-vcores | 4 | 单个container向RM能申请到的最大vcore数量。cloudera公司推荐一个container的vcores最好不要超过5,一般我们设置为4 |
设置DN和NM的内存数
DN和NM在生产上的参数设置为2G和4G即可
组件 | 文件 | 参数 | 大小 | desc |
---|---|---|---|---|
DataNode | hadoop-env.sh | HADOOP_HEAPSIZE= | 1000 | 单位M,生产上一般分配2048即可 |
NodeManager | yarn-env.sh | YARN_HEAPSIZE= | 1000 | 单位M,生产上一般分配4096即可 |
样例
假如服务器有128G内存,16物理cpu,需要装DN和NM,具体如何设置参数
1、装centos需要消耗1G内存
2、系统预留15%-20%,包括装centos的空间,预留的原因是防止全部被使用以及oom事件或者给未来装其他组件预留空间
128*20=25.6G==26G
还剩下 128-26=102G内存
3、假设只有dn和nm组件,装dn和nm分别需要2G和4G内存
还剩下102-2-4=96G内存
container内存的分配
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个
4、container物理核分配 (物理核:虚拟核 =1:2 ==>16:32)
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个
4、需要注意的是pcore:vcore=1:2 所以vcore=16*2=32核;cloudera公司推荐,一个container的vcore最好不要超过5,那么我们设置4
yarn.scheduler.maximum-allocation-vcores 4 极限情况下,只有8个container
5、综合memory+vcore,确定 vcore=4 container 8个
内存的设置为
yarn.scheduler.maximum-allocation-mb 12G 极限container 8个
6、最终的设置为
yarn.nodemanager.resource.cpu-vcores --> 32 # 16*2=32
yarn.scheduler.minimum-allocation-vcores --> 1 # 最多有32个container
yarn.scheduler.maximum-allocation-vcores --> 4 # 最少有8个container
yarn.nodemanager.resource.memory-mb --> 96G # container能使用的最大内存
yarn.scheduler.minimum-allocation-mb --> 1G #
yarn.scheduler.maximum-allocation-mb --> 12G # 极限8个(96/8)
当然当spark计算时内存不够大,这个参数肯定要调大,
那么这种理想化的设置个数必然要打破,以memory为主
假如服务器有256G内存,56物理cpu,需要装DN、NM和hbase regionserver,具体如何设置参数
1、需要减去内存开销和其他组件的开销
预留 15%-20%(包括装centos消耗的内存)
dn 2G
nm 4G
hbase regionserver 30G
还剩余256-2560.2-2-4-30 = 168G
2、pcore:vcore=1:2 ,故vcore数量为562=112;单个container占用4个vcore,确定 memory和vcore,所以最终为
yarn.nodemanager.resource.cpu-vcores --> 112 # 56*2=112
yarn.scheduler.minimum-allocation-vcores --> 1 # 最多有112个container
yarn.scheduler.maximum-allocation-vcores --> 4 # 最少有28个container
yarn.nodemanager.resource.memory-mb --> 168G # RM能使用的最大内存
yarn.scheduler.minimum-allocation-mb --> 1G #
yarn.scheduler.maximum-allocation-mb --> 6G # 极限28个(168/28)
yarn的调度器整理三种
在Yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,FairScheduler。
FIFO 先进先出调度器
先进先出(First In First Out)调度器。FIFO 调度器是 Hadoop 使用最早的一种调度策略,可以简单的将其理解为一个队列,这意味着在集群中同时只能有一个作业运行。所有的应用程序按照提交顺序来执行,在上一个 Job 执行完成之后,下一个 Job 按照队列中的顺序执行。FIFO调度器以独占集群全部资源的方式来运行作业,这样的好处是 Job 可以充分利用集群的全部资源,但是对于运行时间短,优先级高或者交互式查询类的MR Job 需要等待它之前的 Job 完成才能被执行,这也就导致了如果前面有一个比较大的 Job 在运行,那么后面的 Job 将会被阻塞。因此,虽然 FIFO 调度器实现简单,但是并不能满足很多实际场景的要求。这也就促使 Capacity 调度器和 Fair 调度器的诞生。
Capacity 计算调度器
而对于Capacity调度器,有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源,这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。
Fair 公平调度器
在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。如上图所示,当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
需要注意的是,在上图Fair调度器中,从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的Container。小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。最终的效果就是Fair调度器即得到了高的资源利用率又能保证小任务及时完成。
apache和cdh的默认调度器
Apache Hadoop的默认调度器是什么
yarn-site.xml进行设置
key | value | desc |
---|---|---|
yarn.resourcemanager.scheduler.class | org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler | 默认是计算调度器 |
cdh的默认调度器是什么
默认调度器是:公平调度器
可以登录yarn的页面查看
yarn的常用命令
运行jar包
yarn jar
hadoop jar
杀死yarn的进程
使用场景,进程夯住了或者提交错任务了
yarn application -kill < application ID>
下载log日志
[hadoop@JD ~]$ yarn logs
Retrieve logs for completed YARN applications.
usage: yarn logs -applicationId [OPTIONS]
general options are:
-appOwner AppOwner (assumed to be current user if
not specified)
-containerId ContainerId (must be specified if node
address is specified)
-nodeAddress NodeAddress in the format nodename:port
(must be specified if container id is
specified)