Hadoop 在减速器/组合器内映射发射的关键帧更改

Hadoop 在减速器/组合器内映射发射的关键帧更改,hadoop,Hadoop,我需要在映射器中执行两个单独的矩阵乘法(S*A和p*A),并输出这两个结果。我知道我可以用两个mapreduce作业轻松地完成这项工作,但为了节省运行时间,我需要在一个作业中完成它们。所以我要做的是,在完成两次乘法后,我将两个输出都放在context对象中,但使用不同的键,以便在reducer中区分它们: LongWritable One = new LongWritable(); One.set(1); context.write(One, partialSA); LongWritable t

我需要在映射器中执行两个单独的矩阵乘法(S*A和p*A),并输出这两个结果。我知道我可以用两个mapreduce作业轻松地完成这项工作,但为了节省运行时间,我需要在一个作业中完成它们。所以我要做的是,在完成两次乘法后,我将两个输出都放在context对象中,但使用不同的键,以便在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矩阵相加。问题是,如果我使用combiner,我在combiner中接收到的发射密钥是0和1,而不是1和2!!!如果我不使用组合器,在减速机内部,我接收0和1作为键,而不是1和2

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

以下是“我的映射器”的确切清理功能:

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键、Iterable值、上下文上下文)抛出IOException、InterruptedException{
System.out.println(“***In reduce()*****”+key.get());
迭代器itr=values.Iterator();
if(key.get()==1){
while(itr.hasNext()){
SA.addMatrix(itr.next());
}
}else if(key.get()==2){
while(itr.hasNext()){
PA.addMatrix(itr.next());
}
}
}

请编辑您的问题并从映射器和还原器中添加代码片段,好吗?如果不使用减速器或合路器,会发生什么?我猜问题出在映射器中…这是映射器的清理功能:public void cleanup(上下文上下文)抛出IOException,InterruptedException{LongWritable one=new LongWritable();one.set(1);LongWritable two=new LongWritable();two.set(2)Context.write(one,partialSA);Context.write(两个,partialPA);}实际上,我根本不需要组合器,但不使用组合器并不能解决问题,因为在reducer中,我再次收到key的值为0和1。有什么想法吗?我只是把我的清理函数片段放在我的问题中,这样看起来更整洁。好的。我只是指debugging删除减速机并查看映射器输出的原因。是否使用
LongWritable
get()
方法查看数值?是否也可以发布减速机的代码片段?
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());
    }
  }
}