Mapreduce工作流程

1、mapreduce实际处理流程

mapreduce 其实是分治算法的一种现,所谓分治算法就是“就是分而治之 ,将大的问题分解为相同类型的子问题(最好具有相同的规模),对子问题进行求解,然后合并成大问题的解。mapreduce就是分治法的一种,将输入进行分片,然后交给不同的task进行处理,然后合并成最终的解。
mapreduce实际的处理过程可以理解为Input->Map->Sort->Combine->Partition->Reduce->Output

1.1、Input阶段

数据以一定的格式传递给Mapper,有TextInputFormat,DBInputFormat,SequenceFileFormat等可以使用,在Job.setInputFormat可以设置,也可以自定义分片函数。

1.2、Map阶段

对输入的(key,value)进行处理,即map(k1,v1)->list(k2,v2),使用Job.setMapperClass进行设置。

1.3、Sort阶段

对于Mapper的输出进行排序,使用Job.setOutputKeyComparatorClass进行设置,然后定义排序规则。

1.4、Combine阶段

这个阶段对于Sort之后又相同key的结果进行合并,使用Job.setCombinerClass进行设置,也可以自定义Combine Class类。

1.5、Partition阶段

将Mapper的中间结果按照key的范围划分为R份(Reduce作业的个数),默认使用HashPartioner(key.hashCode()&Integer.MAX_VALUE%numPartitions),也可以自定义划分的函数。使用Job.setPartitionClass设置。

1.6、Reduce阶段

对于Mapper阶段的结果进行进一步处理,Job.setReducerClass进行设置自定义的Reduce类。

1.7、Output阶段

Reducer输出数据的格式。

2、一个job运行流程

一个mapreduce作业的执行流程是:作业提交->作业初始化->任务分配->任务执行->更新任务执行进度和状态->作业完成
Mapreduce工作流程_第1张图片
一个完整的mapreduce作业流程,包括4个独立的实体:
客户端:client,编写mapreduce程序,配置作业,提交作业。
JobTracker:协调这个作业的运行,分配作业,初始化作业,与TaskTracker进行通信。
TaskTracker:负责运行作业,保持与JobTracker进行通信。
HDFS:分布式文件系统,保持作业的数据和结果。

2.1、作业提交

JobClient使用runjob方法创建一个JobClient实例,然后调用submitJob()方法进行作业的提交,提交作业的具体过程如下:

(a) 通过调用JobTracker对象的getNewJobId()方法从JobTracker处获得一个作业ID。
(b) 检查作业的相关路径。如果输出路径存在,作业将不会被提交(保护上一个作业运行结果)。
(c) 计算作业的输入分片,如果无法计算,例如输入路径不存在,作业将不被提交,错误返回给mapreduce程序。
(d) 将运行作业所需资源(作业jar文件,配置文件和计算得到的分片)复制到HDFS上。
(e) 告知JobTracker作业准备执行(使用JobTracker对象的submitJob()方法来真正提交作业)。

2.2、作业初始化

当JobTracker收到Job提交的请求后,将Job保存在一个内部队列,并让Job Scheduler(作业调度器)处理并初始化。初始化涉及到创建一个封装了其tasks的job对象,并保持对task的状态和进度的跟踪(step 5)。当创建要运行的一系列task对象后,Job Scheduler首先开始从文件系统中获取由JobClient计算的input splits(step 6),然后再为每个split创建map task。

2.3、任务的分配

TaskTracker和JobTracker之间的通信和任务分配是通过心跳机制完成的。TaskTracker作为一个单独的JVM,它执行一个简单的循环,主要实现每隔一段时间向JobTracker发送心跳,告诉JobTracker此TaskTracker是否存活,是否准备执行新的任务。如果有待分配的任务,它就会为TaskTracker分配一个任务。

2.4、任务的执行

TaskTracker申请到新的任务之后,就要在本地运行了。首先,是将任务本地化(包括运行任务所需的数据、配置信息、代码等),即从HDFS复制到本地。调用localizeJob()完成的。对于使用Streaming和Pipes创建Map或者Reduce程序的任务,Java会把key/value传递给外部进程,然后通过用户自定义的Map或者Reduce进行处理,然后把key/value传回到java中。其中就好像是TaskTracker的子进程在处理Map和Reduce代码一样。

2.5、更新任务执行进度和状态

进度和状态是通过heartbeat(心跳机制)来更新和维护的。对于Map Task,进度就是已处理数据和所有输入数据的比例。对于Reduce Task,情况就邮电复杂,包括3部分,拷贝中间结果文件、排序、reduce调用,每部分占1/3.

2.6、作业完成

当Job完成后,JobTracker会收一个Job Complete的通知,并将当前的Job状态更新为successful,同时JobClient也会轮循获知提交的Job已经完成,将信息显示给用户。最后,JobTracker会清理和回收该Job的相关资源,并通知TaskTracker进行相同的操作(比如删除中间结果文件)。

你可能感兴趣的:(mapreduce,hadoop,工作流程)