大数据Hadoop学习(四)Yarn

Yarn (资源调度器)

  • Yarn 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。

Yarn 基础框架

  • Yarn 主要由下面几个组件构成:
    • ResourceManager:
      • 处理客户端请求
      • 监控NodeManager
      • 启动或监控ApplicationMaster
      • 资源的分配与调度
    • NodeManager:
      • 管理单个节点上的资源
      • 处理来自ResourceManager的命令
      • 处理来自ApplicationManager的命令
    • ApplicationMaster:
      • 为应用程序申请资源并分配给内部的任务
      • 任务的监控与容错
    • Container:是Yarn中的资源抽象,封装了某个节点上的多维度资源
      在这里插入图片描述

工作机制

在这里插入图片描述

  1. MR程序提交到客户端所在的节点。
  2. YarnRunner 向 ResourceManager 申请一个 Application
  3. RM 将该应用程序的资源路径返回给YarnRunner
  4. 该程序将运行所需资源提交到HDFS上
  5. 程序资源提交完毕后,申请运行mrAppMaster
  6. RM将用户的请求初始化成一个Task
  7. 其中一个NodeManager 领取到Task任务
  8. 该NodeManager创建容器Container,并产生MRAppmaster
  9. Container从HDFS上拷贝资源到本地
  10. MRAppmaster向RM申请运行MapTask资源
  11. RM将运行MapTask 任务分配给另外两个NodeManager, 另两个NodeManager 分别领取任务并创建容器
  12. MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager 分别启动MapTask,MapTask 对数据分区排序
  13. MrAppMaster 等待所有 MapTask 运行完毕后,向RM申请容器,运行ReduceTask
  14. ReduceTask 向 MapTask 获取相应分区的数据
  15. 程序运行完毕后,MR 会向 RM 申请注销自己

Yarn 调度器和调度算法

  • Hadoop 作业调度器主要有三种:FIFO、容量(Capacity Scheduler)和公平(Fair
    Scheduler)。Apache Hadoop3.1.3 默认的资源调度器是 Capacity Scheduler。

FIFO调度算法

  • 单队列,根据提交作业的先后顺序,先来先服务。
    在这里插入图片描述
  • 这个方法的缺点就是不支持多队列,生产环境很少使用

容量调度器(Capacity Scheduler)

  • Capacity Scheduler 是 Yahoo 开发的多用户调度器
    在这里插入图片描述
  • 特点:
    • 多队列:每个队列可配置一定的资源量,每个队列采用FIFO调度策略
    • 容量保证:管理员可为每个队列设置资源最低保证和资源使用上限
    • 灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列
    • 多租户:
      • 支持多用户共享集群和多应用程序同时运行
      • 为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源进行限定。

在这里插入图片描述

  • 队列资源分配:从root开始,使用深度优先算法,优先选择资源占用率最低的队列分配资源
  • 作业资源分配:默认按照提交作业的优先级和提交时间顺序分配资源
  • 容器资源分配:按照容器优先级分配资源,如果优先级相同,按照数据本地性原则:
    • 任务和数据在同一节点
    • 任务和数据在同一机架
    • 任务和数据不在同一节点也不在同一机架

公平调度器(Fair Scheduler)

  • 缺额:公平调度器设计目标是:在时间尺度上,所有作业获得公平的资源。某一时刻一个作业应获资源和实际获取资源的差距叫“缺额”。
  1. 公平调度器的特点:
    • 与容器调度器相同点:
      • 支持多队列:支持多队列多作业
      • 容量保证:管理员可为每个队列设置资源最低保证和资源使用上限
      • 灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
      • 多租户:支持多用户共享集群和多应用程序同时运行;为了防止同一个用户的作业占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。
    • 与容量调度器不同点:
      • 核心策略不同:
        • 容量调度器:优先选择资源利用率低的队列
        • 公平调度器:优先选择对资源的缺额比例大的
      • 每个队列可以单独设置资源分配方式:
        • 容量调度器:FIFO,DRF
        • 公平调度器:FIFO,FAIR,DRF
  2. 公平调度器的资源分配方式:
    • FIFO策略:公平调度器每个队列资源分配策略如果选择FIFO的话,此时公平调度器相当于容量调度器
    • Fair策略:是一种基于最大最小公平算法实现的资源多路复用方式,默认情况下,每个队列内部采用该方式分配资源。这意味着,如果一个队列中有两个应用程序同时运行,则每个应用程序可得到1/2的资源;如果三个应用程序同时运行,则每个应用程序可得到1/3的资源。
      • 资源分配流程:
        • 选择队列
        • 选择作业
        • 选择容器
          在这里插入图片描述
      • 几个计算公式:
        • 实际最小资源份额:mindshare = Min(资源需求量,配置的最小资源)
        • 是否饥饿:isNeedy = 资源使用量 < mindshare(实际最小资源份额)
        • 资源分配比:minShareRatio = 资源使用量 / Max (mindshare, 1)
        • 资源使用权重比:useToWeightRatio = 资源使用量 / 权重
    • DRF策略:
      • DRF(Dominant Resource Fairness),我们之前说的资源,都是单一标准,例如只考虑内存(也是Yarn默认的情况)。但是很多时候我们资源有很多种,例如内存,CPU,网络带宽等,这样我们很难衡量两个应用应该分配的资源比例。
      • 那么在YARN中,我们用DRF来决定如何调度:
      • 假设集群一共有100 CPU和10T 内存,而应用A需要(2 CPU, 300GB),应用B需要(6 CPU,100GB)。则两个应用分别需要A(2%CPU, 3%内存)和B(6%CPU, 1%内存)的资源,这就意味着A是内存主导的, B是CPU主导的,针对这种情况,我们可以选择DRF策略对不同应用进行不同资源(CPU和内存)的一个不同比例的限制。
  3. 公平策略案例实操
    • 案例:需求:集群总资源100,有三个队列,对资源的需求分别是: queueA -> 20, queueB ->50, queueC -> 30
      在这里插入图片描述
    • 队列分配流程:
      • 第一次按照绝对公平策略:100/3 = 33.33 每条队列都是33.33,所以就会照成下面的情况
        • queueA:分33.33 → 多13.33
        • queueB:分33.33 → 少16.67
        • queueC:分33.33 → 多3.33
      • 这个时候就要进行第二次分配,将多出来的资源合并,基于缺少的资源队列,就演化成下面的情况:
        • queueA:分20
        • queueB:分33.33 + 16.66 = 50
        • queueC:分30
    • 下面就看看作业层次的分配流程:
      • 首先先看不加权重的:需求:有一条队列总资源12个, 有4个job,对资源的需求分别是: job1->1, job2->2 , job3->6, job4->5
        • 第一次算: 12 / 4 = 3
          • job1: 分3 --> 多2个
          • job2: 分3 --> 多1个
          • job3: 分3 --> 差3个
          • job4: 分3 --> 差2个
        • 第二次算: 3 / 2 = 1.5
          • job1: 分1
          • job2: 分2
          • job3: 分3 --> 差3个 --> 分1.5 --> 最终: 4.5
          • job4: 分3 --> 差2个 --> 分1.5 --> 最终: 4.5
        • 第n次算: 一直算到没有空闲资源
      • 然后看看加了权重怎么分配:需求:有一条队列总资源16,有4个job 对资源的需求分别是: job1->4 job2->2 job3->10 job4->4 每个job的权重为: job1->5 job2->8 job3->1 job4->2
        • 第一次算: 16 / (5+8+1+2) = 1
          • job1: 分5 --> 多1
          • job2: 分8 --> 多6
          • job3: 分1 --> 少9
          • job4: 分2 --> 少2
        • 第二次算: 7 / (1+2) = 7/3
          • job1: 分4
          • job2: 分2
          • job3: 分1 --> 分7/3(2.33) -->少6.67
          • job4: 分2 --> 分14/3(4.66) -->多2.66
        • 第三次算:2.66/1=2.66
          • job1: 分4
          • job2: 分2
          • job3: 分1 --> 分2.66/1 --> 分2.66
          • job4: 分4
        • 第n次算: 一直算到没有空闲资源

常用命令

  1. 列出所有的Application:yarn application -list
    在这里插入图片描述
  2. 根据Appliaction状态过滤:yarn appliaction -list -appSates 状态
    • 所有状态:ALL,NEW,NEW_SAVING,SUBMITTED ,ACCEPTED, RUNNING, FINFISH, FALED, KILLED
      在这里插入图片描述
  3. Kill掉Application:yarn application -kill application_1612577921195_0001在这里插入图片描述
  4. 查询Application日志:yarn logs -applicationId<ApplicationId>
    在这里插入图片描述
  5. 查看Container日志:yarn logs -applicationId<ApplicationId> -containerId<ContainerId>
    在这里插入图片描述
  6. 列出所有Application尝试的列表:yarn applicationattempet -list <ApplicationId>
    在这里插入图片描述
  7. 打印ApplicationAttemp状态:yarn applicationattempt -status<ApplicationAttemptId>
    在这里插入图片描述
  8. 列出所有Container:yarn container -list<ApplicationAttemptId>
    在这里插入图片描述
  9. 打印Container状态:yarn container -status<ContainerId>
    在这里插入图片描述
  10. 列出所有节点:yarn node -list -all
    在这里插入图片描述
  11. 加载队列配置:yarn rmadmin -refreshQueues
    在这里插入图片描述
  12. 打印队列信息:yarn queue -status<QueueName>
    在这里插入图片描述

Yarn 生产核心参数

  1. ResourceManager相关的:
    • yarn.resourcemanager.scheduler.class 配置调度器,默认容量
    • yarn.resourcemanager.schelduler.client.thread-count ResourceManager 处理调度器请求的线程数量,默认50
  2. NodeManager相关:
    • yarn.nodemanager.resource.detect-hardware-capabilities 是否让yarn自己检测硬件进行配置,默认false
    • yarn.nodemanager.resource.count-logical-processors-as-cores 是否将虚拟核数当作CPU核数,默认false
    • yarn.nodemanager.resource.pcores-vcores-multiplier 虚拟核数和物理核数乘数,例如:4核8线程,该参数就应设为2,默认1.0
    • yarn.nodemanager.resource.memory-mb NodeManager使用内存,默认8G
    • yarn.nodemanager.resource.memory-mb.system-reserved-memory-mb NodeManager为系统保留多少内存
    • yarn.nodemanager.resource.cpu-vcores NodeManager使用CPU核数,默认8个
    • yarn.nodemanager.pmem-check-enabled 是否开启物理内存检查限制container,默认打开
    • yarn.nodemanager.vmem-check-enabled 是否开启虚拟内存检查限制container,默认打开
    • yarn.nodemanager.vmem-pmem-ratio 虚拟内存物理内存比例,默认2.1
  3. Container相关
    • yarn.scheduler.minimum-allocation-mb 容器最最小内存,默认1G
    • yarn.scheduler.maximum-allocation-mb 容器最最大内存,默认8G
    • yarn.scheduler.minimum-allocation-vcores 容器最小CPU核数,默认1个
    • yarn.scheduler.maximum-allocation-vcores 容器最大CPU核数,默认4个

Yarn 案例实操(待续)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值