一、 Reduce侧联结

1、Reduce侧联结的数据流

Reduce侧联结采用与数据库技术中相同的命名,故也被称为repartitioned join(重分区联结),或者repartitionedsort-merge join(重分区排序-合并联结)。虽然并非最有效的联结技术,但它是最通用的,进而成为一些更高阶技术的基础。

     Reduce侧联结引入了 一些新的术语与概念,名为data source(数据源)、tag(标签)和group key(组键)。一个数据源类似关系数据库中的一张表。一个数据源可以是单个或多个文件,最重要的是,在一个数据源中的所有记录有相同的结构,类似于一个schema。

MapReduce范式每次以无状态地方式处理一个记录。为了联结数据,我们希望为每个记录标记数据源。

Group key的作用与关系数据库中的join key(联结键)相似,由于datajoin软件包允许group key可由用户自由定义,group key比关系数据库中的join key更为通用。

(1)、极小数据集做repartitionedsort-merge join(重分区排序-合并联结)的主要步骤:

a、mapper首先用一个组键和一个标签封装每个记录(调用map()函数处理每个记录,主要目的是将每个记录打包,使其可以在reduce侧进行联结),组键为连接属性,而标签为记录的数据源(在SQL术语中为table);-----装入

一、 Reduce侧联结_第1张图片

b、在map()封装输入的每个记录后,执行MapReduce标准的分区、洗牌和排序操作,相同组键的所有记录被分为一组;-------分区

一、 Reduce侧联结_第2张图片

c、在具有相同组键的数据集上调用reducer(reduce()函数接收输入数据,并对其值进行完全交叉乘积),生成这些值的所有合并结果,限定个合并中每个值最多被标记一次。---------类似笛卡尔积

一、 Reduce侧联结_第3张图片

d、交叉乘积得到的每个合并结果被送入函数combine()交叉乘积的本质确保了combine()看到的记录都有相同的联结键,且来自于每个数据源(标签)的记录不超过一个,是combine()函数决定了整个操作是内联结、外联结,还是其他方式联结在内联结中,combine()丢弃所有未含有全部标签的合并结果.

    Combine()的作用是将所有值都连接成一个单个记录来输出。联结的顺序完全是由combine()决定的。

-----合并结果

一、 Reduce侧联结_第4张图片

(2)、联结与MapReduce框架的区别:

MapReduce中map()输出记录为键/值对,按键来分区,且相同键的的所有记录终会在单一的reducer中被一起处理;联结中,map()输出一个记录包,采用组键作联结的键,在这个键/值包中,值为原始记录,并用数据源标记(即文件名)。

2、使用DATAJOIN软件包实现联结

Hadoop的datajoin软件包实现了联结的数据流,有一些钩子可有于处理特定数据结构中的详细信息,还有一个特殊的钩子可用于定义combine()的确切功能。

      Datajoin软件包有3个可供继承和具体化的抽象类:DataJoinMapperBase、DataJoinReduceBase、TaggedMapOutput,Map类继承DataJoinMapperBase,Reduce类继承DataJoinReducerBase。Datajoin包已分别在这些基类上实现了map()和reduce()方法,要用于联结数据流,子类仅需实现几种用于配置详细信息的新方法。

Datajoin软件包指定组键为Text类型,而值(即被标记的记录)为TaggedMapOutput类型。

(1)、TaggedMapOut是一种用Text标签封装记录的数据类型。它具体实现了getTag()和setTag(Text tag)方法,并指定抽象方法getData().TaggedMapOut必须为Writable类型。

(2)、DataJoinReducerBase():在联结操作的数据流中,它执行了所有的封装,这个类为它的子类提供了3个可以填充的抽象方法:

      a、   generateInputTag(StringinputFile):在map任务开始时被调用,为map任务所处理的所有记录指定一个全局的标签(Text类型)。使用记录的文件名来调用些方法。些方法的结果存在DataJoinMapperBase对象的变量inputTag中供以后使用。

          b、getnerateTaggedMapOutout()方法封装记录的值为TaggedMapOutput类型。此方法可返回一个带任何我们想要的Text标签的TaggedWritable,原则上,在同一文件中,不同的记录可以用不同的标签,在标准的情况下,希望标签代表一个数据源。

         c、genertateGroupKey()方法取得被标记的记录(TaggedMapOutput类型),并返回用作联结的组键。

 

DataJoinReduceBase是datajoin软件包的核心,它通过执行一个外部联结,简化了我们的编程。它期望combine()返回TaggedMapOutput。在内部联结中,values[]的长度总是等于可用数据源的个数,且标签总是排序的。


你可能感兴趣的:(hadoop)