映射发出的键在reducer / combiner内变化

时间:2014-08-12 11:23:26

标签: hadoop

我需要在我的映射器中进行两次单独的矩阵乘法(S * A和P * A)并发出两者的结果。我知道我可以通过两个mapreduce工作轻松地做到这一点,但为了节省运行时间,我需要在一个工作中完成它们。所以我做的是,在完成两次乘法后,我将两个输出放在上下文对象中,但是使用不同的键,以便我可以在reducer中区分它们:

LongWritable One = new LongWritable();
One.set(1);
context.write(One, partialSA);
LongWritable two = new LongWritable();
two.set(2);
context.write(two, partialPA);

在reduce中,我只需要将所有partialSA矩阵一起添加,并将所有partialPA矩阵加在一起。问题是如果我使用组合器,我在组合器中收到的发射键是0和1而不是1和2!如果我不使用合成器,在reducer内部我会收到0和1作为键而不是1和2.

为什么会这样?有什么问题?

以下是我的mapper的确切清理功能:

public void cleanup(Context context) throws IOException, InterruptedException{
  LongWritable one = new LongWritable();
  one.set(1);
  LongWritable two = new LongWritable();
  two.set(2)
  context.write(one, partialSA);
  context.write(two, partialPA);
}                                                                      

这是reducer()代码:

public void reduce(LongWritable key, Iterable<MatrixWritable> values, Context context) throws IOException, InterruptedException{         
  System.out.println("*** In reduce() **** "+key.get());
  Iterator<MatrixWritable> itr = values.iterator();

  if(key.get() == 1){
    while(itr.hasNext()){
      SA.addMatrices(itr.next());
    }
  }else if(key.get() == 2){
    while(itr.hasNext()){
      PA.addMatrices(itr.next());
    }
  }
}

0 个答案:

没有答案