2011-12-12 74 views
1

我有一種情況,其中映射器作爲鍵發射自定義類型的對象。 它有兩個字段intWritable ID和一個數據數組IntArrayWritable。 執行如下。 `使用自定義對象作爲映射器發出的鍵

import java.io.*; 

import org.apache.hadoop.io.*; 

public class PairDocIdPerm implements WritableComparable<PairDocIdPerm> { 

    public PairDocIdPerm(){ 
     this.permId = new IntWritable(-1); 
     this.SignaturePerm = new IntArrayWritable(); 
    } 


public IntWritable getPermId() { 
     return permId; 
    } 



    public void setPermId(IntWritable permId) { 
     this.permId = permId; 
    } 



    public IntArrayWritable getSignaturePerm() { 
     return SignaturePerm; 
    } 



    public void setSignaturePerm(IntArrayWritable signaturePerm) { 
     SignaturePerm = signaturePerm; 
    } 

    private IntWritable permId; 
    private IntArrayWritable SignaturePerm; 

    public PairDocIdPerm(IntWritable permId,IntArrayWritable SignaturePerm) { 
    this.permId = permId; 
    this.SignaturePerm = SignaturePerm; 
    } 



    @Override 
    public void write(DataOutput out) throws IOException { 
    permId.write(out); 
    SignaturePerm.write(out); 
    } 

    @Override 
    public void readFields(DataInput in) throws IOException { 
    permId.readFields(in); 
    SignaturePerm.readFields(in); 
    } 

    @Override 
    public int hashCode() { // same permId must go to same reducer. there fore just permId 
    return permId.get();//.hashCode(); 
    } 

    @Override 
    public boolean equals(Object o) { 
    if (o instanceof PairDocIdPerm) { 
    PairDocIdPerm tp = (PairDocIdPerm) o; 
    return permId.equals(tp.permId) && SignaturePerm.equals(tp.SignaturePerm); 
    } 
    return false; 
    } 

    @Override 
    public String toString() { 
    return permId + "\t" +SignaturePerm.toString(); 
    } 

    @Override 
    public int compareTo(PairDocIdPerm tp) { 
    int cmp = permId.compareTo(tp.permId); 
    Writable[] ar, other; 
    ar = this.SignaturePerm.get(); 
    other = tp.SignaturePerm.get(); 

    if (cmp == 0) { 
    for(int i=0;i<ar.length;i++){ 
     if(((IntWritable)ar[i]).get() == ((IntWritable)other[i]).get()){cmp= 0;continue;} 
     else if(((IntWritable)ar[i]).get() < ((IntWritable)other[i]).get()){ return -1;} 
     else if(((IntWritable)ar[i]).get() > ((IntWritable)other[i]).get()){return 1;} 
    } 
    } 

    return cmp; 
    //return 1; 
    } 

    }` 

我需要用相同的ID的鑰匙,去同減速器與它們的排序順序爲compareTo方法編碼。 但是,當我使用這個,我的工作執行狀態總是map100%減少0%。減少永遠不會結束。這個實現有什麼錯誤嗎? 一般來說,如果減速器狀態始終爲0%,可能會出現問題。

+0

日誌說什麼?你的工作是如何配置的? –

回答

1

我認爲這可能是在讀法可能空指針異常:

@Override 
    public void readFields(DataInput in) throws IOException { 
    permId.readFields(in); 
    SignaturePerm.readFields(in); 
    } 

permId在這種情況下空。 所以,你必須做的是這樣的:

IntWritable permId = new IntWritable(); 

無論是在現場初始化或讀之前。

但是,您的代碼是可怕的閱讀。

+0

這不是一個空指針異常。結果發現問題出在我的邏輯中的其他地方,而不是在這個完美工作的類代碼中。 – chet

相關問題