Hadoop 使用自定义对象作为映射器发出的关键点

Hadoop 使用自定义对象作为映射器发出的关键点,hadoop,Hadoop,我遇到过这样一种情况,映射器作为键发送自定义类型的对象。 它有两个字段,一个是intWritable ID,另一个是IntArrayWritable中的数据数组。 具体实施如下。 ` import java.io.*; 导入org.apache.hadoop.io.*; 公共类PairDocIdPerm实现了WritableComparable{ 公共PairDocIdPerm(){ this.permId=新的可写整数(-1); this.SignaturePerm=新的IntArrayWri

我遇到过这样一种情况,映射器作为键发送自定义类型的对象。 它有两个字段,一个是intWritable ID,另一个是IntArrayWritable中的数据数组。 具体实施如下。 `

import java.io.*;
导入org.apache.hadoop.io.*;
公共类PairDocIdPerm实现了WritableComparable{
公共PairDocIdPerm(){
this.permId=新的可写整数(-1);
this.SignaturePerm=新的IntArrayWritable();
}
公共IntWritable getPermId(){
返回许可证;
}
public void setPermId(IntWritable permId){
this.permId=permId;
}
public IntArrayWritable getSignaturePerm(){
返回签名项;
}
公共无效设置signaturePerm(IntArrayWritable signaturePerm){
SignaturePerm=SignaturePerm;
}
私有可写许可证;
私人可授权签名条款;
公共PairDocIdPerm(IntWritable permId,IntArrayWritable SignaturePerm){
this.permId=permId;
this.SignaturePerm=SignaturePerm;
}
@凌驾
public void write(DataOutput out)引发IOException{
允许写(出);
签名条款(填写);
}
@凌驾
public void readFields(DataInput in)引发IOException{
许可读取字段(in);
SignaturePerm.readFields(在中);
}
@凌驾
public int hashCode(){//同一个permId必须到同一个reducer。因此只有permId
返回permId.get();//.hashCode();
}
@凌驾
公共布尔等于(对象o){
if(o配对DocidPerm的实例){
PairDocIdPerm tp=(PairDocIdPerm)o;
返回permisd.equals(tp.permisd)和&SignaturePerm.equals(tp.SignaturePerm);
}
返回false;
}
@凌驾
公共字符串toString(){
返回permitd+“\t”+SignaturePerm.toString();
}
@凌驾
公共整数比较(PairDocIdPerm tp){
int cmp=许可比较(tp许可);
可写[]应收账款,其他;
ar=this.SignaturePerm.get();
other=tp.SignaturePerm.get();
如果(cmp==0){
for(inti=0;i((IntWritable)other[i]).get(){return 1;}
}   
}
返回cmp;
//返回1;
}
}`
我要求具有相同Id的键按照compareTo方法中编码的排序顺序进入同一个减速器。 但是,当我使用此选项时,我的作业执行状态始终为map100%减少0%。 reduce永远不会完成。这个实现中有什么错误吗?
一般来说,如果reducer status始终为0%,那么可能会出现什么问题。

我认为这可能是read方法中的空指针异常:

   @Override
    public void readFields(DataInput in) throws IOException {
    permId.readFields(in);
    SignaturePerm.readFields(in);
    }
在这种情况下,permId为null。 所以你要做的是:

IntWritable permId = new IntWritable();
在字段初始值设定项中或在读取之前


但是,您的代码很难读取。

我认为这可能是read方法中的空指针异常:

   @Override
    public void readFields(DataInput in) throws IOException {
    permId.readFields(in);
    SignaturePerm.readFields(in);
    }
在这种情况下,permId为null。 所以你要做的是:

IntWritable permId = new IntWritable();
在字段初始值设定项中或在读取之前


但是,您的代码读起来很糟糕。

日志上说什么?作业是如何配置的?日志上说什么?作业是如何配置的?它不是空指针异常。事实证明,问题出在我的逻辑中的其他地方,而不是这个工作正常的类代码中。它不是空指针异常。事实证明,问题出在我的逻辑中的其他地方,而不是这个类代码中,因为它可以完美地工作。