赞
踩
Yarn是Hadoop的分布式资源调度平台,负责为集群的运算提供运算资源。如果把分布式计算机和单个计算机相对应的话,HDFS就相当于计算机的文件系统,Yarn就是计算机的操作系统,MapReduce就是计算机上的应用程序。
Yarn主要由三个组件组成。
除了这三个组件,首先要说明一个不得不提的概念:Container。
在Yarn中,Container代表着Yarn对计算机资源的抽象,每个容器内包含了CPU、内存、磁盘等运算资源。所有的应用都会运行在Container中,应用向ResourceManager申请Container后运行ApplicationMaster,再根据任务向ResourceManager申请拿到任务下Task的Container。
ResourceManager是整个集群资源的老大,负责整个集群的资源调度,他与每个节点上的NodeManager和每一个应用程序上的ApplicationMaster协调工作。他的主要职责是调度系统中所需的各种可用资源,着眼于应用程序之间的资源调度,并不会关注每个应用程序的状态管理。
ResouceManager主要有两个组件:Scheduler和ApplicationManager。
是一个资源调度器,负责各个运行中的应用的资源分配。和他的名字一样,他只负责给应用分配资源,即Container,不会关心或监控应用程序的具体状态。同样他也不能去重启各种运行失败的应用。对于多个客户端的应用资源请求,Scheduler会将这些作业放在一个或者多个作业队列中,并按照设置的调度方法分配Container。在Hadoop的MapReduce中主要有三种调度方法:FIFO Scheduler、Capacity Scheduler和Fair Scheduler。
FIFO Scheduler:单个队列,先进先出,一般生产环境不使用。
Capacity Scheduler:容量调度器。创建多个队列,为每个队列设置最小资源和最大资源,针对不同的任务队列,可以设置不同的资源权重。队列之间可以互相借用资源,单个队列内采用FIFO原则。适合低负载的情况。
Fair Scheduler:公平调度器。为每个任务公平地动态调整资源,保证资源公平分配,若在分配途中有新的任务加入,则在一定的时间内(并不是立刻,因为需要等待前面的任务释放占用的Container)调整所有任务的所得资源,使得每个作业最终得到相同的资源。
ApplicationManager主要负责接收job的提交请求,为应用分配第一个Container来运行ApplicationMaster,还有就是负责监控ApplicationMaster,在遇到失败时重启ApplicationMaster运行的Container。
NodeManager负责单个节点的老大,每个节点都有自己的NodeManager。NodeManager是一个slave服务:它负责接收ResourceManager的资源分配请求,分配具体的Container给应用。同时,它还负责监控并报告Container使用信息给ResourceManager。通过和ResourceManager配合,NodeManager负责整个Hadoop集群中的资源分配工作。ResourceManager是一个全局的进程,而NodeManager只是每个节点上的进程,管理这个节点上的资源分配和监控运行节点的健康状态。
NodeManager的主要职责如下:
当一个节点启动时,它会向ResourceManager进行注册并告知ResourceManager自己有多少资源可用。在运行期,通过NodeManager和ResourceManager协同工作,这些信息会不断被更新并保障整个集群发挥出最佳状态。
NodeManager只负责管理自身的Container,它并不知道运行在它上面应用的信息。负责管理应用信息的组件是ApplicationMaster。
ApplicationMaster是单个应用程序的老大,向ResourceManager申请资源并和NodeManager协同工作来运行应用的各个任务,然后跟踪它们状态及监控各个任务的执行,遇到失败的任务还负责重启它。
当一个ApplicationMaster启动后,会周期性的向ResourceManager发送心跳报告来确认其健康和所需的资源情况,在建好的需求模型中,ApplicationMaster在发往ResourceManager中的心跳信息中封装偏好和限制。在随后的心跳中,ApplicationMaster会对收到集群中特定节点上绑定了一定的资源的container的租约,根据ResourceManager发来的container,ApplicationMaster可以更新它的执行计划以适应资源不足或者过剩,Container可以动态的分配和释放资源。
resource-request
协议向ResourceManager发送resource-request
请求。container-launch-specification
信息来启动Container,container-launch-specification
信息包含了能够让Container和ApplicationMaster交流所需要的资料。application-specific
协议发送给ApplicationMaster。application-specific
协议。Yarn的设计目标就是允许我们的各种应用以共享、安全、多租户的形式使用整个集群。并且,为了保证集群资源调度和数据访问的高效性,Yarn还必须能够感知整个集群拓扑结构。为了实现这些目标,ResourceManager的调度器Scheduler为应用程序的资源请求定义了一些灵活的协议,通过它就可以对运行在集群中的各个应用做更好的调度,因此,这就诞生了Resource Request和Container。
具体来讲,一个应用先向ApplicationMaster发送一个满足自己需求的资源请求,然后ApplicationMaster把这个资源请求以resource-request的形式发送给ResourceManager的Scheduler,Scheduler再在这个原始的resource-request中返回分配到的资源描述Container。每个ResourceRequest可看做一个可序列化Java对象,包含的字段信息如下:
<resource-name, priority, resource-requirement, number-of-containers>
number-of-containers中的Containers就是ResourceManager给ApplicationMaster分配资源的结果。Container就是授权给应用程序可以使用某个节点机器上CPU和内存的数量。
ApplicationMaster在得到这些Containers后,还需要与分配Container所在机器上的NodeManager交互来启动Container并运行相关任务。当然Container的分配是需要认证的,以防止ApplicationMaster自己去请求集群资源。
参考:
https://www.cnblogs.com/zsql/p/11636112.html
https://blog.csdn.net/suifeng3051/article/details/49508261
https://blog.csdn.net/suifeng3051/article/details/49486927
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。