MapReduce常见计算模式

来源:互联网 发布:自建app软件 编辑:程序博客网 时间:2024/06/05 16:10

MapReduce常见计算模式,即实际编程中如何使用MapReduce实现常见的Top N,join等数据操作。

过滤模式

1,简单过滤模式。简单过滤模式指在一个较大的数据集中按照规则筛选出较小的数据集。由于此类操作不需要对数据进行聚合操作,所以无须Reduce阶段,是一个Map-only类型的方案。
Mapper函数的输入是较大数据集;在mapper内部调用一个判断函数f对内容进行判断,返回true或false;true则输出数据,false则不输出。

2,Top N
从大量数据中,根据记录某个字段内容的大小取出其值最大的n条记录,这也是常见的数据过滤应用场景。这和简单过滤的区别是,简单过滤的条件判断仅涉及当前记录,而Top n计算模式则
需要在记录之间进行比较,并获得全局最大的数据子集。
其基本思路很简单,多个mapper计算出当前数据块内的最大top n的值,也就是局部的最大top n。之后全部局部最大值交由唯一的reducer计算出全局的最大top n。其特点是:
a,Mapper和Reducer中的逻辑是一样的。
b,Reducer只有一个。
c,Mapper和Reducer可以使用任何排序算法找出局部/全局最大值。

Join模式
两个数据集进行join操作也很常见,即两个不同数据集根据相同外键进行信息融合。常见的join包括Reduce-side join和Map-side join。

1,Reduce-side join是解决数据集合join操作的一种通用做法。设现有两个数据集A和B。
首先,Mapper将两个数据集A和B的记录进行处理,抽取出需要做join的外键作为key,记录的其他内容作为value输出,为了解决在reduce阶段进行实际join操作时的时候判断数据来源的问题,
可以增加一个标志信息来表明来源并加入到value中。
然后,通过正常的partition策略并进行shuffle,两个数据集中具有相同外键的记录都被分配到同一个Reducer。partition的算法有很多,例如常见的哈希取模法。对于不同的key,当哈希取模
的结果相同时,就会被分配到同一个reducer。因此一个reducer会处理多个key。reducer根据外键排序后,将同一个key的所有记录聚合在一起。之后对同一个key,reducer根据来源标示维护两个列表
,分别存储来自于数据集A和B的记录,然后即可对数据进行join操作并输出结果。
在整个join过程中,需要partition的过程。因此虽然没有聚合操作,但真正的join需要由reducer完成。

2,Map-side join是另一种常见的join方式,适用于一大一小两个数据集,且小数据集可被放入内存的场景。
将小数据集存入哈希内存表,以外键作为哈希表的key,这样依次读入大数据集的记录并查找哈希值来进行join操作即可完成。由此可见Map-side join是一个Map-only类型的方案。

求和模式
对海量数据求和是非常常见的应用场景。

1,数值求和
例如对于大量的key value数据,根据key对value汇总。大家熟悉的word count就是一个例子,按照单词(key),对value(在这个例子中value都是1,即该单词出现了一次)求和。
实现方式就是典型的MapReduce过程,这里不再累述。

2,记录求和
记录求和用于value不是数值的场景。其处理过程和数值求和大致相同,只是在reduce阶段对与同样key的value不再求和,而是将value累加。
例如搜索引擎中建立倒排索引。数据同样为key value数据,且网页ID为key,value为网页内容。
map函数输出为不同的单词及其对应的网页ID,例如 key为单词hello,value为网页ID。reduce阶段将所有key为hello的网页ID累加在一起,即成为了倒排表。

0 0