高阶MapReduce_3_reducer侧联结原理,mapreduce原理


侧联结原理:

Map端工作:为来自不同表,也就是多个数据集的key/value对贴上一个标签,来区别不同数据源的记录。然后用链接字段作为kye,其余部分和新加的标志作为value,最后输出一个记录包。也就是说。,map端的工作就是做来源判断,并对符合key的值进行区分。

Map端完成之后就是就将数据分组了。

Reduce端工作:在reduce端以链接字段作为key的分组已经完成,我们只需要在每一个分组当中将那些来源于不同文件的记录(在map阶段已经贴上标签的),也就是不同的数据集分开,最后进行迪卡尔积。


程序运行流程:

在自己写的JoinMapperTaggedWritableJoinReduer的代码中,MapReducereducer侧联结运行顺序:

首先,在DataJoinMapperBaseconfigure(JobConfjob)中会调用TaggedWritablegenerateInputTag(StringinputFile)方法来读取数据文件,在我写的小案例中有两个数据集,而在程序执行中,是每次都会遍历一边所有的数据集,看是否读取完所有的数据集;

然后,就调用DataJoinMapperBase类中的map()方法,所以我们在实现侧联结的时候是不需要实现map()的,而只是需要实现DataJoinMapperBasemap()方法中会调用到的generateTaggedMapOutput(Objectvalue)方法和generateGroupKey(TaggedMapOutputrecord)方法,而在generateTaggedMapOutput(Objectvalue)方法中实现的功能就是返回一个带任何我们想要的Text标签的TaggedWritable类,TaggedWritable也是我们需要实现的类,总的来说这个方法的功能就是给数据文件贴上标签;enerateGroupKey(TaggedMapOutputrecord)方法的功能就是对贴上标签的数据文件进行处理。完成这一步之后,map端对数据的分区操作就已经完成了。

接下来,就会调用TaggedWritable类中的readFields(DataInputin)方法,这个方法完成的功能就是读取map分区好的数据,再进行分组操作。

最后,会调用JoinReducer类的combine(Object[]ages, Object[]values)方法,也是重写了DataJoinReducerBasecombine()的方法,这个方法就是将TaggedWritable类中的分好组的数据进行迪卡尔积,最终将map端做好处理的tag作为keycombine中进行迪卡尔积处理的最终数据作为value输出。


至此,侧联结的运行流程就结束了。在下一篇中,将介绍侧联结的小案例。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关内容