焦作市环宇网络科技有限公司
首页 | 联系方式 | 加入收藏 | 设为首页 | 手机站

产品目录

联系方式

联系人:业务部
电话: 00166-889605
邮箱:service@wqwgb.com

当前位置:首页 >> 新闻中心 >> 正文

YARN——Hadoop的集群资源管理系统

字号:
摘要:YARN——Hadoop的集群资源管理系统

相对于昨天的HDFS,YARN明显难一些。

听过大数据的人最多,听过Hadoop的次之,听过YARN的再次之。

本文参考官方文档以及百度百科,去除了一些跟上一代的资源调度管理系统的对比,只求略懂一二,为后面的MapReduce任务铺路。

YARN,Ye Another Resource Negotiator——Hadoop的集群资源管理系统。

它负责以下事情:

  • Resource Management 资源管理
  • Job Scheduling / Monitoring 任务调度、监控

YARN本身非常复杂,详细的文档请参考官方:

https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html

开始吧!


“资源”是什么?

内存、CPU、硬盘、网络……

YARN把这些信息封装起来,用一个概念来表示——Container(容器)

一般来说,1个Container可以运行一个任务(task)

日后Container的内容可能会更加丰富,比如显卡或专用处理器也可能会加入(人工智能改变世界)

Conainer是一个动态资源划分单位,根据app的需求动态产生。我理解它更像一台台虚机,可以独立执行代码(task)。

以下是别人的博客:
Container的一些基本概念和工作流程如下:
(1) Container是YARN中资源的抽象,它封装了某个节点上一定量的资源(CPU和内存两类资源)。它跟Linux Container没有任何关系,仅仅是YARN提出的一个概念(从实现上看,可看做一个可序列化/反序列化的Java类)。
(2) Container由ApplicationMaster向ResourceManager申请的,由ResouceManager中的资源调度器异步分配给ApplicationMaster;
(3) Container的运行是由ApplicationMaster向资源所在的NodeManager发起的,Container运行时需提供内部执行的任务命令(可以使任何命令,比如java、Python、C++进程启动命令均可)以及该命令执行所需的环境变量和外部资源(比如词典文件、可执行文件、jar包等)。
另外,一个应用程序所需的Container分为两大类,如下:
(1) 运行ApplicationMaster的Container:这是由ResourceManager(向内部的资源调度器)申请和启动的,用户提交应用程序时,可指定唯一的ApplicationMaster所需的资源;
(2) 运行各类任务的Container:这是由ApplicationMaster向ResourceManager申请的,并由ApplicationMaster与NodeManager通信以启动之。
以上两类Container可能在任意节点上,它们的位置通常而言是随机的,即ApplicationMaster可能与它管理的任务运行在一个节点上。
一般而言,每个Container可用于运行一个任务。ApplicationMaster收到一个或多个Container后,再次将该Container进一步分配给内部的某个任务,一旦确定该任务后,ApplicationMaster需将该任务运行环境(包含运行命令、环境变量、依赖的外部文件等)连同Container中的资源信息封装到ContainerLaunchContext对象中,进而与对应的NodeManager通信,以启动该任务。
来自:
http://dongxicheng.org/mapreduce-nextgen/understand-yarn-container-concept/

没看懂?没关系,略过就好,看完之后,会更容易理解


接下来,我们从上到下地介绍整个框架。

整个系统一个:ResourceManager (RM),负责整个系统的资源管理和分配。由2部分组成:Scheduler(调度器)、ApplicationsManager (ASM)

每个App一个:ApplicationMaster (App Mstr 或者 AM)

每个节点一个:NodeManager (NM)

放图:

左边2个Client,对应2种颜色,粉色、紫色,每个Client跑了一个App。(右边2个App Mstr)

中间这个是RM,全局唯一。

左边有3个节点,3个NM,每个节点2个Container.从上到下:

  1. 第一个节点,有2个Container(一组资源),其中一个跑了一个App Mstr,但是箭头可以看出,这2个Container并不属于一个App
  2. 第二个节点,跟第一个节点刚好反过来
  3. 第三个节点,有2个粉色App的Container,没有跑第三个App Mstr

再来看看图里面的箭头:

  • 每个NM都要向RM发送本节点的情况(Node Status)
  • 左边2个Client分别向RM提交Job (Job Submission)
此时RM的ASM会起2个App Mstr,并在它们运行失败时重启它
  • App Mstr向RM 发送资源申请 (Resource Request)
RM只负责监控App Mstr,并不负责App Mstr内部任务的容错,这是App Mstr的事儿,它会将一个Job分解为多个task,并与RM协调执行所需要的Container,将任务分配给Container。App Mstr将与NM一起安排、执行、监控这些Container
  • 每个Container向App Mstr发送 MapReduce Status (MapReduce 任务的状态)

Okay,到这里,你应该已经对整个集群的工作方式,有了大概的了解。


接下来是一些细致的介绍。

RM的Secheduler

调度器,它会根据一些条件限制,比如capacities(容量), queues(队列)(每个队列分配一定的资源,最多执行一定数量的作业。队列是一个挺重要的概念,我相信以后还会遇到),将系统的资源(Container)分配给 正在运行 的App。

Secheduler的工作是纯粹的,它仅分配Container。不负责对App监控、跟踪、失败重启等等

RM的ApplicationsManager:

ASM,它会做Secheduler不做的事情,负责管理整个系统中,所有的App,包括了:

  • Job Submision
  • 与Secheduler协商,拿出这个App的第一个Container来运行该App的App Mstr
  • 在App Mstr挂掉时,重启它

(但它也只面向App Mstr,不管App Mstr下面Container的情况)

App Mstr:

  • 与Secheduler协商合适的Container
  • 跟踪他们的状态
  • 监控它们的进程
  • 与NM通信以启动/停止Container
  • (官网原话:ApplicationMaster has the responsibility of negotiating appropriate resource containers from the Scheduler, tracking their status and monitoring for progress.)

NM:

每个节点上的资源和任务管理器,它负责:

  • 定时向RM汇报本节点上的Container使用情况、以及各个Container的运行情况
  • 接受并处理来自AM的Container启动/停止等各种请求

YARN 的几个概念:

  • ResourceManager
  • ApplicationMaster
  • NodeManager

1、ResourceManager

  • 负责接受客户端提交的 job,分配和调度资源
  • 启动 ApplicationMaster,判断 job 所需资源
  • 监控 ApplicationMaster,在其失败的时候进行重启
  • 监控 NodeManager

2、ApplicationMaster

  • 为 MapReduce 类型的程序申请资源,并分配任务
  • 负责相关数据的切分
  • 监控任务的执行及容错

3、NodeManager

  • 管理单个节点的资源,向 ResourceManager 进行汇报
  • 接收并处理来自 ResourceManager 的命令
  • 接收并处理来自 ApplicationMaster 的命令

MapReduce 编程模型

  • 场景:输入一个大型文件,通过 split 将其分成多个文件分片
  • Map:每个文件分片由单独的机器进行处理,这就是 Map 方法
  • Reduce:将各个机器的计算结果进行汇总,得到最终的结果,这就是 Reduce 方法

Map 任务处理

  1. 读取输入文件的内容,解析成键值对,把文件的每一行解析成键值对,每个键值对调用一次 map 函数;(Input)
  2. 写自定义的逻辑,对输入的键值对进行处理,转换成新的键值对输出;(Map)
  3. 对不同分区的数据,按照键(key)进行排序和分组,key 相同的值(value)放到一个集合中;(Sort -> Combine)
  4. 把输出的键值对(此时只是中间结果)按照 key 的范围进行分区处理;(Partition)
  5. 分组后的数据进行 reduce 处理。

Reduce 任务处理

  1. 对多个 map 任务的输出,按照不同分区,通过网络 copy 到不同的 reduce 节点;
  2. 对多个 map 任务的输出进行合并和排序,自定义 reduce 函数的逻辑,对输入的键(key)和值(value)进行处理,转换成新的键值对输出;(Reduce)
  3. 把 reduce 的输出保存到文件中。(Output)

MapReduce 的整个工作流程可以归结为:

Input -> Map -> Sort -> Combine -> Partition -> Reduce -> Output


写完以后,觉得Container的概念非常复杂,不过我觉得没有必要纠结于一个点废太多时间,日后自然会懂的。

希望对你有帮助。

转自:知乎 大鱼和葛尧的回答
链接:https://zhuanlan.zhihu.com/p/33198500
链接:https://zhuanlan.zhihu.com/p/31810137