实时数据相关大数据

YARN工作原理 YARN调度器

2019-02-20  本文已影响29人  流浪山人

Mapreduce 1.0 旧的MapReduce架构

旧的MapReduce架构

MapReduce架构

基本概念

旧的架构的问题

  1. JobTracker是MapReduce的集中处理点,存在单点故障
  2. JobTracker完成了太多的任务,造成了过多的资源消耗,当MapReduce job 非常多的时候,会造成很大的内存开销。这也是业界普遍总结出老Hadoop的MapReduce只能支持4000 节点主机的上限
  3. 在TaskTracker端,以map/reduce task的数目作为资源的表示过于简单,没有考虑到cpu/ 内存的占用情况,如果两个大内存消耗的task被调度到了一块,很容易出现OOM
  4. 在TaskTracker端,把资源强制划分为map task slot和reduce task slot, 如果当系统中只有map task或者只有reduce task的时候,会造成资源的浪费,也就集群资源利用的问题

Hadoop2.0 YARN 架构

在这里插入图片描述
在这里插入图片描述

在Hadoop2.0中, YARN负责管理MapReduce中的资源(内存, CPU等)并且将其打包成Container. 这样可以精简MapReduce, 使之专注于其擅长的数据处理任务, 将无需考虑资源调度. YARN会管理集群中所有机器的可用计算资源. 基于这些资源YARN会调度应用(比如MapReduce)发来的资源请求, 然后YARN会通过分配Container来给每个应用提供处理能力

基本概念

ResourceManager
NodeManager
ApplicationMaster
Container

在Hadoop集群中,平衡内存(RAM)、处理器(CPU核心)和磁盘的使用是至关重要的,合理规划以免某一项引起瓶颈制约。一般的建议是,一块磁盘和一个CPU核心上配置两个Container会达到集群利用率的最佳平衡,Container是YARN中处理能力的基本单元, 是对内存, CPU等的封装
从可用的硬件资源角度看,要调整群集每个节点Yarn和MapReduce的内存配置到合适的数据,应注意以下几个重要的元素:

每个节点的内存总量 建议保留系统内存 建议保留HBase的内存
4 GB 1 GB 1 GB
8 GB 2 GB 1 GB
16 GB 2 GB 2 GB
24 GB 4 GB 4 GB
48 GB 6 GB 8 GB
64 GB 8 GB 8 GB
72 GB 8 GB 8 GB
96 GB 12 GB 16 GB
128 GB 24 GB 24 GB
256 GB 32 GB 32 GB
512 GB 64 GB 64 GB

保留内存=保留系统内存+保留HBase内存(如果HBase是在同一个节点)
下面的计算是确定每个节点的Container允许的最大数量。
Container数量=min (2CORES, 1.8DISKS, (可用内存)/最低Container的大小)
最低Container的大小 这个值是依赖于可用的RAM数量——在较小的存储节点,最小的Container的大小也应较小。下面的表列出了推荐值:

每个节点的总内存 建议的最低Container的大小
小于 4 GB 256 MB
4 GB 到 8 GB 512 MB
8 GB 到 24 GB 1024 MB
24 GB 以上 2048 MB

最后计算的每个Container的内存大小是

每个Container的内存大小 = max(最小Container内存大小, (总可用内存) /Container数))

新旧架构对比

YARN 的核心就是将jobTracker的功能进行拆解,分成了资源管理和任务调度监控两个进程,一个全局的资源管理和每个作业的管理。ResourceManager和Nodemanager提供了计算资源的分配和管理,ApplicationMaster负责完成程序的运行.YARN架构下形成了一个通用的资源管理平台和一个通用的应用计算平,避免了旧架构的单点问题和资源利用率问题,同时也让在其上运行的应用不再局限于MapReduce形式

Yarn基本流程

在这里插入图片描述
  1. 用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等
  2. ResourceManager为该应用程序分配第一个Container,并与对应的Node-Manager通信,要求它在这个Container中启动应用程序的ApplicationMaster
  3. ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManage查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7
  4. ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源
  5. 一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务
  6. NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务
  7. 各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态
  8. 应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己

Yarn调度器Scheduler

理想情况下,我们应用对 Yarn 资源的请求应该立刻得到满足,但现实情况资源往往是
有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到
相应的资源。在Yarn中,负责给应用分配资源的就是Scheduler。其实调度本身就是一个
难题,很难找到一个完美的策略可以解决所有的应用场景。为此Yarn提供了多种调度器
和可配置的策略供我们选择。在 Yarn 中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,Fair Scheduler。

三种调度器基本原理
在这里插入图片描述
配置文件位置

YARN-FailOver

任务失败

  1. 运行时异常或者JVM退出都会报告给AM
  2. 通过心跳检查任务的timeout,会检查多次(可配置)才判断该任务是否有效
  3. 失败的任务或者作业都有AM重新运行

ApplicationMaster失败

  1. AM 定时发送心跳信号到RM,通常一旦AM失败,就认为失败,但是也可以通过配置多次失败才算失败
  2. AM失败后,RM会启动一个新的ApplicationMaster
  3. 新的AM负责回复之前错误的AM的状态,(yarn.app.mapreduce.am.job.recovery.enable=true),这一步是通过将应用运行状态保存到共享的存储上来实现的,ResourceManager不会负责任务状态的保存和恢复
  4. Client也会定时向ApplicationMaster查询进度和状态,一旦发现其失败,则向ResouceManager询问新的ApplicationMaster

NodeManager失败

  1. NodeManager定时发送心跳到ResourceManager,如果超过一段时间没有收到心跳消息,ResourceManager就会将其移除
  2. 任何运行在该NodeManager上的任务和ApplicationMaster都会在其他NodeManager上进行恢复
  3. 如果某个NodeManager失败的次数太多,ApplicationMaster会将其加入黑名单,任务调度时不在其上运行任务

ResourceManager失败

  1. 通过checkpoint机制,定时将其状态保存到磁盘,然后失败的时候,重新运行
  2. 通过zookeeper同步状态和实现透明的HA
上一篇 下一篇

猜你喜欢

热点阅读