Hadoop, 大数据

hadoop-20 Yarn

Yarn资源调度器

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

Yarn基础架构

YARN主要由

  • ResourceManager
    • 整个资源的老大
  • NodeManager
    • 单节点资源的老大
  • ApplicationMaster
    • 每一个作业任务的老大
  • Container
    • 容器

ResourceManager

  • 处理客户端请求
  • 监控NodeManger
  • 启动或监控ApplicationMaster
  • 资源的分配和调度

NodeManager

  • 管理单个节点上的资源
  • 处理来自ResourceManger的命令
  • 处理来自ApplicationMaster的命令

ApplicationMaster

  • 为应用程序申请资源并分配给内部的任务
  • 任务的监控与容错

Container

  • 是YARN中的资源抽象,封装了某个节点上的多维度资源,如内存、CPU、磁盘和网络等

Yarn的工作机制

  • 客户端提交任务 YarnRunner,向RM申请一个Application
  • RM返回给客户端将要运行任务的资源提交到指定的HDFS路径
  • 客户端上传运行job所需要的资源
    • Job.split切片信息 MapTask个数
    • Job.xml 运行任务的参数
    • 程序jar包
  • 客户端上传完资源向RM申请运行MrAppMaster
  • RM将用户的请求初始化成一个Task放到任务队列中
  • NM领取Task任务,并创建Container,下载job资源到本地,读取切片信息
  • MRAppMaster向RM申请运行MapTask的容器
  • RM按照MapTask生成两个任务,NM将任务领走,创建Container
  • MrAppMaster发送程序启动脚本,告知程序开始运行
  • MapTask结束后按照分区持久化到磁盘,等待ReduceTask拉取
  • MrAppMaster向RM申请两个容器运行ReduceTask程序
  • NM上开始执行ReduceTask任务
  • 结束后MRAppMaster告知RM运行job的资源全部释放

其他:

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

作业提交全过程

作业提交:

  • Client调用job.watForCompletion方法,向整个集群提交MapReduce作业
  • Client向RM申请一个作业id
  • RM给Client返回该job资源的提交路径和作业id
  • Client提交jar包、切片信息和配置文件到指定的资源提交路径
  • Client提交完资源后,向RM申请运行MRAppMaster

作业初始化:

  • 当RM收到Client的请求后,将该job添加到容量调度器中
  • 某一个空闲的NM领取到该job
  • 该NM创建Container,并产生MRAppMaster
  • 下载Client提交的资源到本地

任务分配:

  • MRAppMaster向RM申请运行多个MapTask任务资源
  • RM将运行MapTask任务分配给另外两个NodeManager,这两个NodeManager分别领取任务并创建容器

任务运行:

  • MRAppMater向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序
  • MRAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask
  • ReduceTask向MapTask获取相应分区的数据
  • 程序运行完毕后,MR会向RM申请注销自己

进度和状态更新:

  • YARN中的任务将其进度和状态(包括counter)返回给应用管理器,客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新,展示给用户

作业完成:

  • 除了向应用管理器请求作业进度外,客户端每5秒都会通过调用waitForCompletion()来检查作业是否完成,时间间隔可以通过mapreduce.client.completion.pollinterval来设置,作业完成之后,应用管理器和Container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户检查

YARN调度器

FIFO、容量调度器(Capacity Scheduler)、公平调度器(Fair Scheduler)

  • Apache Hadoop3.1.3默认调度器 Capacity Scheduler
  • CDH默认调度器 Fair Scheduler

配置文件yarn-default.xml:

  • yarn.resourcemanager.scheduler.class

FIFO

容量调度器

算法

公平调度器

DRF:内存+CPU

缺额

实际最小资源份额:mindshare = Min(资源需求量,配置的最小资源)

是否饥饿:isNeedly = 资源使用量 < mindshare(实际最小资源份额)

资源分配比:minShareRatio = 资源使用量/Max(mindshare, 1)

资源使用权重比:useToWeightRatio = 资源使用量 / 权重

作业资源分配