MapReduce1
经典MapReduce(MapReduce1)的工作原理:
最顶层的独立工作实体:
- 客户端,提交MapReduce作业
- jobtracker,协调作业的运行。
- tasktracker,运行作业划分后的任务。
- HDFS,用于在其他实体间共享作业文件
1、作业的提交
JobClient:Job的submit()方法创建一个内部的JobSummiter实例。提交作业后,waitForCompletion()方法每秒轮询作业的进度。如果发现自上次报告后有所改变,便把进度报告到控制台。作业完成后,如果成功就显示作业计数器;如果失败就导致作业失败的错误被记录到控制台。
JobSummiter所做的工作是在提交MapReduce任务后,创建JobId、验证(输入、输出)目录是否存在、计算作业的分片数、作业运行所需资源的备份
2、作业的初始化
JobTracker:JobTracker接收到对其submit()方法的调用后,会把此调用放入一个内部队列中,交由作业调度器进行调度,并对其进行初始化。初始化包括创建一个表示正在运行作业的对象,用于封装任务和记录信息,以便跟踪任务的状态和进程。
创建任务运行列表:从共享文件系统(HDFS)中获取客户端计算好的输入分片,每个分片创建一个map任务。创建Reduce任务的数量由Job的mapred.reduce.tasks属性决定,在代码中可用job.setNumReduceTasks(n)设置,然后调度器创建相应数量的要运行的reduce的任务。
3、任务的分配
tasktracker运行一个简单的循环来定期发送“心跳”给jobtracker。“心跳”向jobtracker表明tasktracker是否还存活,同时也充当两者之间的消息通道。tasktracker会在心跳中指明它是否已经准备好运行新的任务。如果是,jobtracker会为它分配一个任务,并使用“心跳”的返回值与tasktracker进行通信。
1、在jobtracker为tasktracker选择任务之前,jobtracker必须先选定任务所在的作业。
2、对于map和reduce任务,tasktracker有固定数量的任务槽,两者是独立的。默认调度器在处理reduce任务槽之前,会填满空闲的map任务槽。
例:一个tasktracker可能可以同时运行两个map任务和两个reduce任务。准确数量由tasktracker核的数量和内存大小决定。
注意:对于map任务,jobtracker会考虑tasktracker的网络位置,并选取一个距离其输入分片文件最近的tasktracker。在最理想的情况下,任务是数据本地化的,也就是任务运行在输入分片所在的节点上。对于reduce任务,jobtracker从待运行reduce任务列表中选取下一个来执行,用不着考虑数据的本地化。
4、任务的执行
tasktracker:通过从共享文件系统把作业的Jar文件copy到tasktracker所在的文件系统,实现作业的Jar文件本地化。同时,tasktracker将应用程序所需要的全部文件从分布式缓存copy到本地磁盘。tasktracker为任务新建本地工作任务,解压JAR文件中的内容到这个文件夹下。然后tasktracker新建一个TaskRunner实例运行该任务。
YARN
在经典的MapReduce中,Jobtracker负责作业调度和任务进度监视,追踪任务、重启失败或过慢的任务和进行任务登记。
在MapReduce1中,jobtracker负责资源调度和任务分配、监控。资源调度是负责CPU、硬盘等硬件资源,任务分配是作用于程序、进程。当Hadoop集群的节点数过大时,若jobtracker发生故障,则对集群的影响很大。
Yarn将这两种角色划分为两个独立的守护进程:管理集群上资源使用的资源管理器和管理集群上运行任务生命周期的应用管理器。
基本思路是:应用服务器与资源管理器协商集群的计算资源;容器,在这些容器上运行特定应用程序的进程。
YARN设计的精妙之处在于不同的YARN应用可以在同一个集群上共存。例如:在一个YARN集群里可以跑MapReduce、Spark、TensorFlow等程序,甚至。用户可能在同一个YARN集群上运行多个不同版本的MapReduce,这使得MapReduce升级过程更容易管理。
下图为Hadoop1.0与Hadoop2.0的对比图
如图可知,Hadoop2.0在Hadoop1.0后,变得更具拓展性,YARN的角色更像一个操作系统,底层是硬盘(或者狭隘上说是HDFS),在YARN之上能兼容更多的YARN应用。
上图就很形象的解释了YARN模块多样性的含义。YARN在对不同应用进行管理和调度资源,期待使本集群的资源利用最大化。
YARN将jobtracker的职能划分为多个独立的实体,从而改善了MR1的瓶颈问题。
YARN将jobtracker划分为两个独立的守护进程:管理集群上资源使用资源管理器和管理集群上运行任务生命周期的应用管理器。
基本思路是:应用服务器与资源管理器协商
集群的计算资源:容器,在这些容器上运行特定应用程序的进程。
YARN的MapReduce比经典的MapReduce包括更多的实体:
- 提交MapReduce客户端
- YARN资源管理器,负责协调集群上计算资源的分配
- YARN节点管理器,负责启动和监视集群中机器上的计算容器
- HDFS,用于在其他实体间共享作业文件
Hadoop使用YARN运行MapReduce的过程与使用MR1的差异
1、作业提交
作业提交后,从资源管理器(而不是jobtracker)获取新的作业ID
2、作业初始化
资源管理器收到提交的消息后,便将请求传递给调度器。调度器分配一个容器,然后资源调度器在节点管理器的管理下在容器中启动应用程序的master进程。
3、任务分配
application master就会为该作业中的所有map任务和reduce任务向资源管理器请求容器。附着心跳信息的请求包括每个map任务的数据本地化信息,特别是输入分片所在的主机和相应机架信息。