一、Map输入端
当作业进行切片后被提交到MR进行执行时,必须经过Mapper类的run方法进行任务的执行,这样我们在map端的自定义map方法也会执行,而根据业务需求我们可以对map端的输出进行业务逻辑的处理,以达到在Reduce我们对Map端处理的数据进行接收,并进行计算。
1.自定义类中继承Mapper类
2.进入mapper.class类中,我们可以看到有setup()方法,还有自定义类继承的map()方法,以及cleanup方法,最重要的当然是run方法了。
调用一次次setup()方法–可以做预处理,准备资源
map()业务执行:
首先判断context上下文对象中是否包含key和vlaue,如果有则开始调用map()方法,则在这里开始执行自定的map方法,进行自定义逻辑代码的运行,当上下文对象中没有值时,跳出循环,执行cleanup方法,结束执行。
在每循环一次时,会将congtext对象的key和value传递,然后我们对key和value进行自己的逻辑处理
cleanup()清除申请的资源
将map端执行的结果进行发送输出
一、MapTask
到这里那么map端的资源时怎么过来的呢?当作业提交完成时(这里前面一节说过了),在分配到container容器之后,会执行MapTask,Reduce Task,MapTask会拿着container所提交上来的job作业进行处理。下面从MapTask执行开始解析
1.run方法的执行
首先会进行检查是否是mapTask任务,这里当然是了
然后获取配置文件中的reduce数量,如果reduce数量为0,则map端的输出直接输出的存储系统中,这里是可以没有reduce。
然后开始执行map阶段的任务,进行mapPhase进行数据的映射,和排序。
继续执行
到这里进行判断是否用新的API执行作业,当然是了。
2.在调用run方法时,将job,splitmetainfo,umbilical.reporter作为参数传递给runNewMapper()方法
然后执行一系列的初始化方法
-创建输入格式化类-默认情况是TextInputFormat
-获取切片信息,包括,文件名称,偏移量offset,切片的大小size,location切片位置信息
-创建RecordReader(split,taskContext),将数据切片的信息和taskContext上下文对象的信息进行传递
进入RecordReader中----TextInputFormat