比如input文件的key是单词,value是单词出现的次数,现在要用MapReduce算每个单词的频率(其实就是一个Map…)。这个过程用MapReduce怎么搞?需要先数出所有单词的总次数,然后处理每一行都要用这个值。。
1
lcj2class 2015-03-07 12:53:30 +08:00
你可以这么搞,
在map阶段,使用counter API在累计单词出现总次数。 context.getCounter().increment(Integer.valueOf(value)) 之后在reduce阶段,你可以直接取到这个counter |
2
chaucerling 2015-03-07 12:56:28 +08:00
1.首先将任务拆分,发给map server
2.map server处理,输出类似 word 1 app 1 word 1 word 1 app 1 .. 3.将map输出的结果发给reduce server 4.reduce server 统计,输出类似 word 3 app2 .. 5.发给接受结果的服务器储存 |
3
ShiehShieh 2015-03-07 13:02:59 +08:00
map: 得到键值对,word:count.
Hadoop进行sort. reduce: 将sorted的输入进行合并就可以了。 。。。好像就是一个典型的MapReduce的流程,不需要什么全局变量的好像。。。还是我理解错了楼主的意思? |
4
Valyrian OP |
5
wzxjohn 2015-03-07 14:28:37 +08:00 via iPhone
你的问题不适合用 mr 。。。统计部分适合,但是计算频率部分不适合。
最好的方法是先用 mr 统计出总数,然后把总数作为常量直接丢到统计次数的 reducer 里面。这样两轮 mr 不需要额外处理可以完成。。。 |
6
monkeylyf 2015-03-07 14:50:41 +08:00
这个为什么要用mr来跑? 没有map逻辑没有reduce逻辑也没有并行逻辑
或者说是1tb的key/value 文件? |
8
yuankui 2015-03-08 11:04:35 +08:00
这不就是 example 里面的 wordcount 例程吗??
|