Yarn入门

Yarn入门

在这里插入图片描述

Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度

  • yarn 并不清楚用户提交的程序的运行机制

  • yarn 只提供运算资源的调度(用户程序向 yarn 申请资源,yarn 就负责分配资源)

  • yarn 中的主管角色叫 ResourceManager

  • yarn 中具体提供运算资源的角色叫 NodeManager

  • yarn与运行的用户程序完全解耦,意味着yarn上可以运行各种类型的分布式运算程序,

    比如 mapreduce、storm,spark,tez ……

  • spark、storm 等运算框架都可以整合在 yarn 上运行,只要他们各自的框架中有符合

    yarn 规范的资源请求机制即可

  • yarn 成为一个通用的资源调度平台.企业中以前存在的各种运算集群都可以整合在一

    个物理集群上,提高资源利用率,方便数据共享

Yarn三大组件

  • ResourceManager 负责所有资源的监控、分配和管理
  • ApplicationMaster 负责每一个具体应用程序的调度和协调
  • NodeManager 负责每一个节点的维护

ResourceManager

  • RM负责整个集群的资源管理和分配,是一个全局的资源管理系统
  • NM以心跳的方式向 RM汇报资源使用情况(目前主要是 CPU 和内存的使用情况)
  • RM只接收请求, 不对具体资源进行处理

NodeManager

  • NM是每个节点上的资源和任务管理器,它是管理这台机器的代理,负责该节点程序的运行,以及该节点资源的管理和监控
  • NM定时向 RM汇报本节点资源(CPU、内存)的使用情况和Container 的运行状态
  • NM接收并处理来自 ApplicationMaster 的 Container 启动、停止等各种请求

ApplicationMaster

  • 用户提交的每个应用程序均包含一个ApplicationMaster
  • 负责与 RM 调度器协商以获取资源(用 Container 表示)
  • 将得到的任务进一步分配给内部的任务(MapTask ReduceTask)
  • 监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务

Yarn 运行流程

在这里插入图片描述

  • 客户端请求RM获得资源(continer)运行AM
  • AM启动后, 与RM保持联系, 并申请continer运行task
  • RM返回continer后, AM要求NM启动continer, 并与NM保持通信, 对运行的task进行监控和管理
  • 应用运行期间,client 直接与 AM 通信获取应用的状态、进度更新等信息。
  • 应用运行结束后,ApplicationMaster 向 ResourceManager 注销自己,并允许属于它的continer被收回

Yarn调度器Scheduler

理想情况下,我们应用对 Yarn 资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源。

在Yarn 中,负责给应用分配资源的就是 Scheduler。

在 Yarn 中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,FairScheduler。默认采用 Capacity Scheduler

  • FIFO Scheduler

    • FIFO Scheduler 把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源
    • 会导致其他应用阻塞
    • 在这里插入图片描述
  • Capacity Scheduler

    • Capacity 调度器允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。
    • 每个组织内采用FIFO
    • 在这里插入图片描述
    Capacity 调度器 配置使用
    capacity-scheduler.xml
    
    配置
    	root
    		prod   40%
    		dev	   60%  max:75%
    			mapreduce	60%*50%
    			spark		60%*50%
    
    <configuration>
        <!-- root下 有两个队列 prod和dev-->
        <property>
            <name>yarn.scheduler.capacity.root.queues</name>
            <value>prod,dev</value>
        </property>
        <!-- dev 有两个队列 mapreduce和spark-->
        <property>
            <name>yarn.scheduler.capacity.root.dev.queues</name>
            <value>mapreduce,spark</value>
        </property>
         <!-- prod正常情况下占用40%-->
        <property>
            <name>yarn.scheduler.capacity.root.prod.capacity</name>
            <value>40</value>
        </property>
        <!-- dev正常情况下占用60%-->
        <property>
            <name>yarn.scheduler.capacity.root.dev.capacity</name>
            <value>60</value>
        </property>
        <!-- 即使prod时空闲的, dev最多占用75%, 留25%给prod应急用 -->
        <property>
            <name>yarn.scheduler.capacity.root.dev.maximum-capacity</name>
            <value>75</value>
        </property>
        <!--mapreduce占用dev的50% -->
        <property>
            <name>yarn.scheduler.capacity.root.dev.mapreduce.capacity</name>
            <value>50</value>
        </property>
        <!--spark占用dev的50% -->
        <property>
            <name>yarn.scheduler.capacity.root.dev.spark.capacity</name>
            <value>50</value>
        </property>
    </configuration>
    
    • 在 MapReduce 中,我们可以通过mapreduce.job.queuename 属性指定要用的队列。如果队列不存在,我们在提交任务时就会收到错误。如果我们没有定义任何队列,所有的应用将会放在一个 default 队列中。

    • 对于 Capacity 调度器,我们的队列名必须是队列树中的最后一部分(prod mapreduce spark),如果我们使用队列树则不会被识别。

  • Fair Scheduler

    • 在 Fair 调度器中,我们不需要预先占用一定的系统资源,Fair 调度器会为所有运行的job 动态的调整系统资源。
    • 当第一个大 job 提交时,只有这一个 job 在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair 调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
    • 在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值