yarn应用:node
分布式计算框架(Mapreduce、spark等)做为yarn应用运行在集群计算层(yarn)和存储层(hdfs和hbase上)。app
Yarn的运行机制:框架
(1) 客户端练习资源管理器,请求他运行一个application master。分布式
(2) 资源管理器找到一个可以在容器中启动application master 的节点管理器。oop
(3)根据application master 本身来肯定的,若是所需资源少或者代码给定为一个,那么就通过简单的计算将结果反馈给客户端:若是所需资源大,或者须要节点运算,那么就向资源管理器申请更多的容器。spa
(4)进行分布式计算。当程序运行完成时,ApplicationMaster从Resourcemanager注销其容器,执行周期就完成了。线程
yarn中的调度:blog
在yarn中有三种调度器能够选择:FIFO Scheduler,Capacity Scheduler,Fair Scheduler。队列
FIFO Scheduler 把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求知足后再给下一个分配,以此类推. FIFO Scheduler 是最简单的也是最容易理解的调度器,也不须要任何配置,但它并不适用于共享集群。大的应用可能会占用全部集群资源,这就致使其余应用被阻塞。进程
而对于Capacity调度器,有一个专门的队列用来运行小任务,可是为小任务专门设置一个队列会预先占用必定的集群资源,这就致使大任务的执行时间会落后于使用FIFO 调度器时的时间。
在Fair调度器中,咱们不须要预先占用必定的系统资源,Fair调度器回为全部运行的job动态的调整系统资源。以下图所示:当第一个大job提交时,只有这一个job在运行,此时它得到了全部集群资源;当第二个小任务提交后,Fair调度器会分配通常资源给这个小任务,让这两个小任务公平的共享集群资源。须要注意的是,在下图fair调度器中,从第二个任务提交得到资源会有必定的延迟,由于它须要等待第一个任务释放占用的Container。小任务执行完成后也会释放本身占用的资源,大任务又得到了所有的系统资源。最终的效果就是Fair调度器即获得了高的资源利用率又能保证小任务及时完成。
抢占当一个job提交到一个繁忙集群中的空队列时,job并不会立刻执行,而是阻塞直到正在运行的job释放系统资源,为了使提交job的执行时间更具预测性(能够设置等待的超时时间),Fair调度器支持抢占,抢占就是容许调度器杀掉占用超过其应占份额资源队列的containers,这些cintainers资源即可被分配到应该享有这些份额资源的队列中,须要注意抢占会下降集群的执行效率,由于被终止的containers须要被从新执行。
hadoop_yarn内存调优
(1) yarn.nodemanager.resource.memory-mb
表示在该节点上yarn可以使用的物理内存数量,默认是8192(MB),注意,若是你的节点内存资源不够8GB,则须要减少这个值,而yarn不会只能的检测节点的物理内存总量。
(2)yarn.nodemanager.vmem-pmem-ratio
任务每使用1mb物理内存,最多可以使用虚拟内存,默认是2.1
(3)yarn.nodemanager.pmem-check-enabled
是否启动一个线程检查每一个任务正使用的物理内存量,若是任务超出分配值,则直接将其杀掉,默认是true。
(4)yarn.nodemanager.vmem-check-enabled
是否启动一个线程检查每一个任务正使用的虚拟内存量,若是任务超出分配值,则直接将其杀掉,默认是true。
(5)yarn.scheduler.minimum-allocation-mb
单个任务可申请的最少物理内存量,默认是1024(MB),若是一个任务申请的物理内存量少于该值,则该对应的值改成这个数。
(6)yarn.scheduler.maximum-allocation-mb
单个任务可申请的最多物理内存量,默认是8192(MB).
(7)小总结:计算节点的内存占用量。
默认状况下,一个同时运行了 namenode,secondarynamenode 和 nodemanager 的主节点,各自使用1000M 内存,因此总计使用3000M。
默认状况下,一个从节点运行了以下守护进程:
1个 datanode:默认占用1000M内存.
1个 tasktracker:默认占用1000M内存.
最多2个map任务:2*200M=400M.
最多2个reduce任务:2*200M=400Ma