例1:文件的字符串查找
这里reduce不做merge的工作,因为每行都是不一样的,不能merge.
与传统的grep程序相比,使用MapReduce可以加快处理,因为1它是Distributed的,不用把所有的文件都拷到一台机器上运行,你的data可以在不同的server上,
原因2,它能并行处理,加快处理的速度。
例2: Reverse Web-link graph
Map:将<source,target>置反
Reduce: 输出每个target的source list.(不止一个)
例3: 计算URL的访问频率
有两个MapReduce,一个MapReduce计算每个URL的数量(类似前面的wordcount),另一个MapReduce计算比率(紧跟前面的那个MapReduce)。
第二个MapReduce中的reducer有会进行两次pass,一次是计算overall_count,一次是计算比率
例4: 排序
MapReduce内部的enginer已经做了很多sorting,这样可以让我们更简单的实现sorting
在每个Map(注意是在一个map里面进行了排序)执行后,这些输入Map的pairs已经在接下来输入给Reduce之前按照key排好序了(在Hadoop中是按照快排进行排序)
Reduce在接收pairs,处理这些pairs之间会对它们进行排序,比如这些pairs如果按照key来排序的话,同一个key的pairs是连续分布的,这样可以把同一个key的pairs输入给一个Reduce来处理
上述的这个例子是要将pairs按照values进行排序后输出.
在Map阶段,将value做为key,这样map阶段结束后输出的pairs在每个Map里面是按照value进行排序(quick sort)的。
在Reducer阶段,在处理前,会将所有的pairs进行排序(Merge sort),然后再对这些pairs进行输出。这样所有的pairs则都是按照value进行排序了
在这儿不能使用Hash partition来分配reducer,因为这儿我们是进行排序,如果使用hash来分配reducer处理的话,那么reducer之间就不是有序的了
在这儿我们分配reducer是按照range来分配的,比如reducer#1处理key1-key1000的pairs,reducer#2处理key10001-key2000的pairs......
在这个例子中我们在分配reducer的时候也要考虑keys的分布情况,比如若key10001-key2000分布的记录很多,则我们可以给这个区域多分配一些reducer来处理