1.剖析MapReduce作业运行机制
1).经典MapReduce–MapReduce1.0
整个过程有有4个独立的实体
- 客户端:提交MapReduce
- JobTracker:协调作业的运行
- TaskTracker:运行作业划分后的任务
- HDFS:用来在其他实体之间共享作业文件
以下为运行整体图
A.作业的提交
JobClient的runJob是用于新建JobClient实例并调用其submitJob()方法的便捷方式,提交Job后,runJob()每秒轮询检测作业的进度,随时监控Job的运行状态。
其中JobClient的submitJob()方法所实现的作业提交过程:
- 向JobTracker请求一个新的作业ID
- 检查作业的输出说明
- 计算作业的输入分片
- 将运行作业所需要的资源(Jar文件,配置文件和计算所得输入分片)复制到一个作业ID命名的目录下JobTracker的文件系统中。
B.作业的初始化
JobTracker接收对其提交的作业后,会把这个调用放入一个队列,交由作业调度器调度,初始化。初始化包括创建一个表示正在运行作业的对象—封装任务和记录信息,以便跟踪任务的状态和进程
C.任务的分配
TaskTracker运行简单的循环来对JobTracker发送心跳,告知自己的是否存活,同时交互信息,对于map任务和reduce任务,TaskTracker会分配适当的固定数量的任务槽,理想状态一般遵循数据本地化,和机架本地化
D.任务的执行
第一步:TaskTracker拷贝JAR文件到本地,第二部:TaskTracker新建本地目录,将JAR文件加压到其下面;第三步:TaskTracker新建一个TaskRunner实例运行该任务。
Streaming和Pipes可运行特殊的Map和Reduce任务,Streaming支持多语言的编写,Pipes还可以与C++进程通信,如下图:
E.进程和状态的更新
通过Job的Status属性对Job进行检测,例如作业云习惯状态,map和reduce运行的进度、Job计数器的值、状态消息描述等等,尤其对计数器Counter(计数器)属性的检查。状态更新在MapReduce系统中的传递流程如下
F.作业的完成
当JobTracker收到Job最后一个Task完成的消息时候便把Job的状态设置为”完成“,JobClient得知后,从runJob()方法返回
2).Yarn(MapReduce 2.0)
Yarn出现在Hadoop 0.23和2.0版本中,相对前面 MapReduce的性能有不少的提高
相比较MapReduce1.0,JobTracker在MRv2 中被拆分成了两个主要的功能使用守护进程执行:资源管理和任务的调度与监视。这个想法创建一个全局的资源管理(global ResourceManager (RM))和为每个应用创建一个应用管理(ApplicationMaster (AM))。一个应用可以使一个MR