文章目录
- Hadoop集群架构
在分布式存储和计算方面,Hadoop采用的是主从架构,集群主要由NameNode,DataNode,SecondaryNameNode,JobTracker,TaskTracker组成。
一、Hadoop 1.x的传统集群调度框架
经典的Hadoop 1.x 的MapReduce采用Master/Slave结构
-
Master是整个集群唯一的全局管理者,功能包括作业管理、状态监控和任务调度等(JobTracker);
- JobTracker是一个后台服务进程,启动之后,会一直监听并接收各个TaskTracker发送的心跳信息,包括资源使用情况和任务运行情况等;
- JobTracker的功能:作业控制(作用是容错和为任务调度提供决策依据)、资源管理(TaskTracker与JobTracker和Task之间采用RPC协议进行通信)。
-
Slave负责任务的执行和任务状态的回报(TaskTracker);
- TaskTracker的功能:汇报心跳(Tracker周期性地将所有节点上的各种信息【包括机器级别信息(如节点健康情况、资源使用情况)和任务级别信息(如任务执行进度、任务运行状态)】通过心跳机制汇报给JobTracker)、执行命令(主要包括启动任务、提交任务、杀死任务、杀死作业和重新初始化)。
-
JobTracker对应于 Hadoop的HDFS架构中的NameNode节点;
- JobTracker是一个Mater服务,软件启动之后JobTracker接收Job,负责调度Job的每一个子任务Task,使其运行于TaskTracker上,并监控它们。一般情况下应该把JobTracker部署在单独的机器上
-
TaskTracker对应于 Hadoop的HDFS架构中的DataNode节点;
- TaskTracker是运行在多个节点上的Slave服务;TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个任务。TaskTracker需要运行在HDFS的DataNode上。
- TaskTracker是运行在多个节点上的Slave服务;TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个任务。TaskTracker需要运行在HDFS的DataNode上。
二、Hadoop/MapReduce 1.x的架构问题
在传统的MapReduce中,JobTracker同时负责作业调度和任务进度管理,JobTracker节点成为整个平台的瓶颈。
- 单点故障&节点压力大&不易扩展
- JobTracker受内存限制,导致扩展性受限
- 中心化架构的通病,一旦JobTracker崩溃,整个集群都会崩溃
- TaskTracker的Map Slot和Reduce Slot是固定的,不是动态分配的资源
三、1.x版本的独立集群集中调度
中央式调度器特点是:
- 资源调度和作业管理功能全部都放到一个进程中完成。
缺陷: - 集群的扩展性差,集群的规模容易受限;
- 新的调度策略难以融入现有的代码,容易发生性能瓶颈和单点故障。
四、Hadoop 2.x的集群调度框架YARN
YARN只是一个资源管理的框架,并不是一个计算框架,计算框架可以运行在YARN上
1. YARN的思想
将JobTracker的责任划分给两个独立的守护进程:
- 资源管理器:负责管理集群的所有资源
- 应用管理器:负责管理集群上任务的生命周期
2. YARN双层调度架构
YARN由Resource Manager、Node Manager和ApplicationMaster三部分组成。
- ResourceManager(RM):主节点服务、负责维护节点信息和负责资源管理与作业调度,可以部署两台并利用ZooKeeper实现高可用;
- NodeManager(NM):计算节点服务,负责接收RM请求分配Container并管理Container的生命周期;向RM汇报所在节点信息;可以部署1~N台;
- ApplicationMaster(AM):用户每提交一个应用都会包含一个ApplicationMaster,负责与RM通信,申请或释放资源,与NM通信启动和停止Task;监控任务的运行状态;
- Client:负责提交作业,同时提供一些命令行工具。
3. 具体做法
应用管理器向资源管理器提出资源需求,以container为单位,然后在这些container中运行与该应用相关的进程。container由运行在集群节点上的节点管理器监控,以确保应用不会用超资源。每个应用的实例(即一个MapReduce作业)都有一个自己的应用管理器。
- YARN包括以下几个角色:
- 客户端:向整个集群提交MapReduce作业
- YARN资源管理器:负责调度整个集群的计算资源
- YARN节点管理器:在集群的机器上启动以及监控container
- MapReduce应用管理器:调度某个作业的所有任务;应用管理器和任务运行在container中,container由资源管理器调度,由节点管理器管理;
- 分布式文件系统:通常是HDFS;
4. YARN中运行一个作业的流程
1)作业提交
- YARN中提交作业的API和经典的MapReduce很像;
- 作业提交的过程和经典的MapReduce也很像,新的作业ID(应用ID)由资源管理器分配;
- 作业的客户端核实作业的输出,计算输入的split,将作业的资源复制给HDFS;
- 调用资源管理器的submitApplication()来提交作业;
2) 作业初始化
- 当资源管理器收到submitApplication()请求时,就将该请求发送给调度器(scheduler),调度器分配第一俄国container,然后资源管理器在该container内启动应用管理器进程,由节点管理器监控;
- MapReduce作业的应用管理器通过创造一些bookkeeping对象来监控作业的进度,得到任务的进度和完成报告;
- 通过分布式文件系统得到由客户端计算好的输入split,并为每个输入split创建一个Map任务,创建Reduce任务对象;
- 应用管理器决定如何运行构成整个作业的任务;(如果作业很小,应用管理器会选择在其自己的JVM中以unerized或Uber Task方式运行任务)
与MapReduce中由TaskTracker运行的一个任务调用不同,在YARN中是由应用管理器调用的
3)任务分配
- 如果不是小作业,则应用管理器向资源管理器请求container来运行所有的Map和Reduce任务【每个任务对应一个container,并且只能在该container上运行】,这些请求通过心跳传输,包括每个Map任务的数据位置(比如存放输入split的主机名和机架rack);调度器利用这些信息来调度任务,尽量将任务分配给存储数据的节点,或者是分配给和存放输入split的节点相同机架的节点;
- 请求也包括了任务的内存需求,默认情况下Map和Reduce任务的内存需求都是1024MB;
- 分配内存的方式:在MapReduce中每个TaskTracker都有固定数量的slot,slot是在集群配置时设置的,每个任务都运行在一个slot中,每个slot都有最大内存限制,也是集群固定的;而在YARN中,资源划分粒度更细,应用的内存需求可以介于最小内存和最大内存之间,并且必须是最小内存的倍数。
4)任务运行
- 当一个任务由资源管理器的调度器分配给一个container后,应用管理器通过节点管理器启动container;
- 运行任务之前首先本地化 任务需要的资源,比如作业配置、jar文件以及分布式缓存的所有文件
- 运行Map或Reduce任务。
- YarnChild运行在一个专用的JVM中,但是YARN不支持JVM重用。
5)进度和状态更新
- YARN中的任务将其进度和状态返回给应用管理器,任务每3秒通过接口向Application Master汇报进度和状态,作为作业的汇聚视图;
- 客户端每秒都向应用管理器请求进度更新,展示给用户;
6)作业完成
- 客户端每5分钟都会通过叫用waitForCompletion来检查作业是否完成;
- 作业完成后,应用管理器和container都会清理工作状态,OutputCommiter的作业清理方法也会被调用;
- 作业的信息会被作业历史服务器存储以备之后用户核查。
5. 简化的YARN调度流程
1)Client提交作业到YARN上;
2)资源管理器选择一个Node Manager,启动一个container并运行应用管理器实例;
3)ApplicationMaster根据实际需要向资源管理器请求更多的container资源;(如果作业很小,应用管理器会选择在其自己的JVM中运行任务)
4)ApplicationMaster通过获取container资源执行分布式计算。
五、Hadoop作业调度器(Scheduler)
1. FIFO先进先出调度器
FIFO是Hadoop中默认的调度器,也是一种批处理调度器。
它先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业。
2. Capacity Scheduler容量调度器
机制:集群由多个队列组成,在每个队列内部,作业按照FIFO进行调度。本质上,容量调度器运行用户或组织为每个用户或组织模拟出一个FIFO调度策略的独立MapReduce集群。
- 容量调度器支持多个队列,每个队列都可配置一定的资源量,采用FIFO调度策略,为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。
- 调度时,按以下策略选择一个合适队列:计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,选择一个比值最小的队列。
- 然后按以下策略选择该队列中的一个作业:按照作业的优先级和提交的时间顺序选择,同时考虑用户资源量限制和内存限制。
3. Fair Scheduler公平调度器
与容量调度器类似,支持多队列多用户,每个队列中的资源量都可以配置,同一队列中的作业公平共享队列中的所有资源。
公平调度器可同时运行几个任务,目标就是让每个用户公平共享集群。
- 特性:
- 当只有一个任务,这个任务就会占有集群全部的资源;
- 新增加一个任务,会分配时间片来执行此任务,每个任务占有一半的集群资源;
- 每增加一个任务,就会重新分配集群资源。
- 该特性让小作业在合理的时间内完成的同时,又不“饿”到消耗时间较长的大作业;
- 改进点1:定制容量和权重:可以用Map和Reduce的任务槽数来定制作业池的最小容量和每个池的权重
- 改进点2:支持抢占机制:如果一个池在特定的时间内未能完成公平资源的共享,就会终止占有大量资源的作业任务,把资源分配到占有资源较小的作业任务。