A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1,Yarn架构设计

在hadoop当中无论是hdfs还是yarn都是服从主从设计的架构的,就是一个主节点用于管理整个集群,而一堆的从节点就是实际工作者了。而在yarn当中,主节点进程为ResourceManager,从节点进程为NodeManager。我们简单回顾一下提交作业到yarn上面的流程,client先将作业提交的RM上的ApplicationManager,ApplicationManager根据需求分配一个container给这个作业,同时ApplicationManager向对应的NM进行rpc通信要求其启动一个container并在里面放置这个作业相关的ApplicationMaster程序,随后ApplicationMaster反向向ApplicationManager进行注册,并想ResourceScheduler申请资源列表,当ApplicationMaster拿到资源列表后就向相关的NM通信要求启动container给task进行运行。

那么这里当container是个什么东西呢?我们可以将它当作一个容器,装的是我们机器上的资源,比如:cpu,内存,磁盘等。由于在作业运算的过程当中,一个NM中可能不止一个task需要运算,不同task需要不同的资源,为了避免task之间的资源上的混乱,我们使用container来承载一个task同时这个container也将封装起这个task所需要的资源。所以我们就这么理解吧,container是一个资源的抽象封装好了。

2,yarn的常用命令

我们直到hadoop jar是提交一个jar包到yarn上面去运行的。那么也存在这样的命令yarn jar用于提交jar到yarn上运行,这两个命令是一样的。用于对当下运行的作业进行管理的命令也又两个:yarn application 和 mapred job 一般在生产上面我们都是使用前者,因为能在yarn上面跑的可不止mapred,还有什么spark等等。

3,yarn上的调优

既然container是yarn上面对资源的封装,那么我们对yarn的调优其实就是对container上一些细节进行优化了呗。

内存:

这里我先给出三个参数:yarn.nodemanager.resource.memory-mb,yarn.scheduler.minimum-allocation-mb,yarn.scheduler.maximum-allocation-mb。

现在我假设我的这个节点上的内存有48G,其中25%是要给Linux的,而剩余的75%给大数据进程。其中,我们一般习惯把DN和NM放置在同一个机器上(数据本地化)。默认的DN是给到4个G,而NM是给到3个G,这两个参数分别是在hadoop-env.sh和yarn-env.sh两个shell脚本当中设置(这个参数以后我们再具体地来讲)。

通过上面的设置,我们现在还剩多少个G的内存可以用呢?48*0.75-4-3=29G,也就是说我们的容器contanier最多也就可以有29个G了,这个时候你要考虑的是这29个G是否都要全给container使用呢?这个参数就是上面我所给出的三个参数的第一个参数: yarn.nodemanager.resource.memory-mb,当这个参数设置成剩余全部内存时意味着我们的NM在执行tasks的时候可以使用到29个G。而第二个参数所决定的是单一一个contnaier最小将分配多少的G,我们生产上一般是设置成2个G,要是你机器上剩余的内存达不到2个G就不再在这个机器上开启container了。而最后一个参数是设置单一个container的最大内存分配,为什么要这样设置呢?因为当一个container开启以后,在上面放置的task不是一下子就使用到最大内存极限的,一般会先个2个G(就是最小内存限制),如果不够了就是继续增加,再不够再增,直到最大内存限制,还不够就报错。所以最大内存设置一般和整个节点的contanier可用内存设置是一样大的,这样当一个contanier占用了大部分资源时,如果再来一个container万一不够内存就糟了。

当内存超出的时候,我们也可以设置两个参数来控制自动将这个内存超出的进程杀死,然后让ApplicationMaster再行分配其他节点上的container给他,yarn.nodemanager.pmen-check-enable 和 yarn.nodemanager.vmen-check-enable,将这两个参数都设置成true就可以了。

cpu:

vcore:虚拟cpudcoure yarn自己引入的新概念,因为不同的物理core的性能不同,所以为了是的每个core的计算能力能一致点,这个时候设置了一个vcore。

一般1个物理core对应2个vcore,当然也有写公司是1:1的。

而cpu同样也有三组参数:yarn.nodemanager.resource.cpu-vcores,yarn.scheduler.minimum-allocation-vcores 和 yarn.scheduler.maximum-allocation-vcores,三组默认值分别是8,1,8。假如:你的物理core是8个话,你要考虑究竟要个多少个core给大数据使用,如果是给了6个core预留2个core给其他进程,这样你的vcore将有12个。

4,yarn的调度器

当我们同时提交两个job到yarn上面的时候,yarn的调度器是怎么运行。分为三种情况:a,队列式的先进先出,当你先后提交了两个job到lyarn上的时候,无论时间上的差异是多少,yarn都是将所有的资源先给第一个job让其完成后才开始第二个job的运行。b,计算模式下,yarn在计算的时候会事先预留一定的资源出来,无论你是否提交了多个job,第一个需求资源较多的job将使用主要的资源,但是这个时候也同时有一定的资源被闲置下来,当有其他的job被提交时才使用这部分资源来计算(这个模式下在多任务时可能还好,但是在单个job的时候将浪费了一定的资源)。c,这中是公平式的资源分配,也是我们在生产上常用的模式。合理分配资源给正在运行的所有job,如果只有一个job的时候,那么这个job就占用所有的资源,如果job的数量不止两个的时候就公平分配呗,直到有一个job先完成了。


1 个回复

倒序浏览
奈斯,感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马