MapReduce:Mapper和Reducer可以共享变量吗?

时间:2017-03-24 00:53:23

标签: java hadoop mapreduce

我使用JavaHadoop代表MapReduce

输入(txt文件):

doc1    apple pizza apple
doc2    pear apple
doc3    cookie noodle apple
doc4    pizza milk
.
.
.

Mapper读取上面文本文件的每一行并发出(word, 1)。但是,因为Reducer应该知道每个单词在WHOLE文档中出现的数量。例如,在" apple"的情况下,它出现在doc1,doc2,doc3以及' 3'需要Reducer

我想的是这样的: 自Reducer所有Mapper工作完成后Mapper开始运行,HashMap每次发出(word, 1)时都会计算Mapper的值增加。例如,当doc1读取(word, 1)行时,它会将整个内容设为唯一字词(=> apple pizza)。每次发出(apple, 1)时,请hashMap['apple'] ++Mapper

在完成所有Reducer个工作后,HashMap访问此(@movies + @pictures).sort_by { |model| model.created_at } ,以便它可以使用每个单词在整个文档中出现的次数。

我已经阅读了How to share a variable in Mapper and Reducer class?,但我希望得到你们的意见。

p.s抱歉英语不好,但我不是本地人。请注意,如果你不明白我在说什么。

1 个答案:

答案 0 :(得分:0)

我不确定我到底知道你在做什么。

这是什么目标? 如果要计算所有记录中每个单词的次数,它就会像这样工作:

映射器:

function map(){
  String[] arr = line.split(" ");
  foreach(String word : arr){
    context.write(word,1)
  }
}

在地图之后,所有按键将按键排序,并组合在一起。 这是非常重要的特征。

示例:

 Mapper:
    doc1 will produce:
    apple 1
    pizza 1
    apple 1

在映射器之后,文档将按键分组: apple => [1,1] 披萨=> [1]

减速机:

function reduce(apple, [1,1]){

        count=0;
        foreach(value in values) do:
          count++
        done

        context.write(key,count) ; //Here you will have the number of apples 
    in all your docs 
}