预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

(1)MapReduce工作流程2013-09-18一.Map->ReduceMapReduce其实是分治算法的一种实现,所谓分治算法就是“就是分而治之”,将大的问题分解为相同类型的子问题(最好具有相同的规模),对子问题进行求解,然后合并成大问题的解。MapReduce就是分治法的一种,将输入进行分片,然后交给不同的task进行处理,然后合并成最终的解。具体流程图如下:MapReduce实际的处理过程可以理解为Input->Map->Sort->Combine->Partition->Reduce->Output。(1)Input阶段数据以一定的格式传递给Mapper,有TextInputFormat,DBInputFormat,SequenceFileFormat等可以使用,在Job.setInputFormat可以设置,也可以自定义分分片函数。(2)Map阶段对输入的<key,value>进行处理,即map(k1,v1)->list(k2,v2),使用Job.setMapperClass进行设置。(3)Sort阶段对于Mapper的输出进行排序,使用Job.setOutputKeyComparatorClass进行设置,然后定义排序规则。(4)Combine阶段这个阶段对于Sort之后有相同key的结果进行合并,使用Job.setCombinerClass进行设置,也可以自定义CombineClass类。(5)Partition阶段将Mapper的中间结果按照Key的范围划分为R份(Reduce作业的个数),默认使用HashPatitioner(key.hashCode()&Integer.MAX_VALUE)%numPartitions),也可以自定义划分的函数。使用Job.setPartitionClass进行设置。(6)Reduce阶段对于Mapper的结果进一步进行处理,Job.setReducerClass进行设置自定义的Reduce类。(7)Output阶段Reducer输出数据的格式。二、一个Job运行流程一个MapReduce作业的执行流程是:作业提交->作业初始化–>任务分配–>任务执行–>更新任务执行进度和状态->作业完成一个完整的MapReduce作业流程,包含4个独立的实体:客户端:Client,编写MapReduce程序,配置作业,提交作业。JobTracker:协调这个作业的运行,分配作业,初始化作业,与TaskTracker进行通信。TaskTracker:负责运行作业,保持与JobTracker进行通信。HDFS:分布式文件系统,保持作业的数据和结果。(1)作业提交JobClient使用runJob方法新建一个JobClient实例,然后调用submitJob()方法进行作业的提交,提交作业的具体过程如下:通过调用JobTracker对象的getNewJobId()方法从JobTracker处获得一个作业ID。检查作业的相关路径。如果输出路径存在,作业将不会被提交(保护上一个作业运行结果)。计算作业的输入分片,如果无法计算,例如输入路径不存在,作业将不被提交,错误返回给MapReduce程序。将运行作业所需资源(作业Jar文件、配置文件和计算所得到的分片)复制到HDFS上。告知JobTracker作业准备执行(使用JobTracker对象的submitJob()方法来真正提交作业)。(2)作业初始化当JobTracker收到Job提交的请求后,将job保存在一个内部队列,并让JobScheduler(作业调度器)处理并初始化。初始化涉及到创建一个封装了其tasks的job对象,并保持对task的状态和进度的根据(step5)。当创建要运行的一系列task对象后,JobScheduler首先开始从文件系统中获取由JobClient计算的inputsplits(step6),然后再为每个split创建maptask。(3)任务的分配TaskTracker和JobTracker之间的通信和任务的分配是通过心跳机制完成的。TaskTracker作为一个单独的JVM,它执行一个简单的循环,主要实现每隔一段时间向JobTracker发送心跳,告诉JobTracker此TaskTracker是否存活,是否准备执行新的任务。如果有待分配的任务,他就会为TaskTracker分配一个任务。(4)任务执行TaskTracker申请到新的任务之后,就要在本地运行了。首先,是将任务本地化(包括运行任务所需的数据、配置信息、代码等),即从HDFS复制到本地。调用localizeJob()完成的。对于使用Streaming和Pipes创建Map或者Reduce程序的任务,Java会把key/valu