Hadoop Yarn
Posted 大数据DL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop Yarn相关的知识,希望对你有一定的参考价值。
一、yarn 的架构
二、yarn job提交流程
三、yarn失败机制
四、yarn调度策略
Yarn 英文全称:Yet Another Resource Negotiator
一、yarn 的架构
yarn架构主要为以下四部分
a、主节点 :ResourceManager
1)处理客户端请求
2)启动或监控ApplicationMaster
3)监控NodeManager
4)资源的分配与调度
b、应用管理器: ApplicationMaster
1)负责数据的切分
2)为应用程序申请资源并分配给内部的任务
3)任务的监控与容错
c、从节点 :NodeManager
1)管理单个节点上的资源
2)处理来自ResourceManager的命令
3)处理来自ApplicationMaster的命令
d、抽象资源:Container
1)对任务运行环境进行抽象,封装CPU、内存等多维度的资源
二、yarn job提交流程
a、作业提交:
client 调用job.waitForCompletion方法,向整个集群提交MapReduce作业 (第1步) 。 新的作业ID(应用ID)由资源管理器分配(第2步). 作业的client核实作业的输出, 计算输入的split, 将作业的资源(包括Jar包, 配置文件, split信息)拷贝给HDFS(第3步). 最后, 通过调用资源管理器的submitApplication()来提交作业(第4步)
b、 作业初始化:
当资源管理器收到submitApplciation()的请求时, 就将该请求发给调度器(scheduler), 调度器分配container, 然后资源管理器在该container内启动应用管理器进程, 由节点管理器监控(第5步).
MapReduce作业的应用管理器是一个主类为MRAppMaster的Java应用. 其通过创造一些bookkeeping对象来监控作业的进度, 得到任务的进度和完成报告(第6步). 然后其通过分布式文件系统得到由客户端计算好的输入split(第7步). 然后为每个输入split创建一个map任务, 根据mapreduce.job.reduces创建reduce任务对象.
c、任务分配:
如果作业很小, 应用管理器会选择在其自己的JVM中运行任务。
如果不是小作业, 那么应用管理器向资源管理器请求container来运行所有的map和reduce任务(第8步). 这些请求是通过心跳来传输的, 包括每个map任务的数据位置, 比如存放输入split的主机名和机架(rack). 调度器利用这些信息来调度任务, 尽量将任务分配给存储数据的节点, 或者分配给和存放输入split的节点相同机架的节点.
d、任务运行:
当一个任务由资源管理器的调度器分配给一个container后, 应用管理器通过联系节点管理器来启动container(第9步). 任务由一个主类为YarnChild的Java应用执行. 在运行任务之前首先本地化任务需要的资源, 比如作业配置, JAR文件, 以及分布式缓存的所有文件(第10步). 最后, 运行map或reduce任务(第11步).
e、进度和状态更新
YARN中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户。
当客户端 读到 程序 结束的状态, applicationmaster 清除 资源container
f、 作业完成
除了向应用管理器请求作业进度外, 客户端每5分钟都会通过调用waitForCompletion()来检查作业是否完成. 时间间隔可以通过mapreduce.client.completion.pollinterval来设置. 作业完成之后, 应用管理器和container会清理工作状态, OutputCommiter的作业清理方法也会被调用. 作业的信息会被作业历史服务器存储以备之后用户核查.
三、yarn失败机制
1、map或者reduce 任务失败 机制
当 map 或者 reduce 运行有异常 , 反馈给 applicationmaster,它会 进行尝试重新启动 map reduce,如果 4次启动不起来 就 把这个 节点上的 任务标记成失败,失败数量 超过 一定数 整个 mapreduce任务 就停止了。
2、applicationmaster 运行失败
resourcemanager首先 在另外一个新的容器中 启动一个 applicationmaster,
默认是 没有保存 之前运行 任务的状态的 所以 applicationmaster 要重新运行任务,所以 这里我们可以优化 设置 让它 重启的时候 恢复之前状态,不过要消耗点 效率 和 内存资源 ,然后 客户端程序 读取 进度状态 和 是否完成的时候 ,由于超时 ,所以 它要重新去 resourcemanager读取 一下新applicationmaster
3、节点管理器运行失败
重新把 失败的节点任务 分到 读取hdfs其它副本 机器上运行,保证 本地性,
reduce 可以 找个负载小的 运行。
4、资源管理器运行失败
如果 resourcemanager挂掉 你的应用 就不能提交了,你需要重新启动resourcemanager节点,但是 正在运行的 没有影响
四、yarn调度策略
1、先进先出(FIFO):一个任务独占集群,就是个队列 哪个 先来 那个就独占资源,这样导致 本来小任务作业 也的 在等着,效率太低
2、公平调度 : 每个任务平分集群资源, 在 FIFO基础上 做了 一个 资源平均分配,一开始 是提交了一个作业 那么这个作业 就占用了 整个 集群资源,当另外一个作业到来时 只能等着 它释放完一点, 它用一点,慢慢 达到平衡,这样会造成 后面的任务进来 后发现 集群还有 资源 为什么 我的 mr 程序 运行不了。
例如(有两个任务:如果集群总共10G,第一个任务占内存2 G,第二个任务占内存8G,如果使用的是公平调度,则每个任务平均5G.第一个任务正常执行消耗2G,虽然此时集群还有8G,但是第二个任务不能正常执行,因为第二个任务只有5G的使用权。)
3、容器调度 : 这个是可伸缩的,可以配置每个任务资源大小。
以上是关于Hadoop Yarn的主要内容,如果未能解决你的问题,请参考以下文章