带有ChainMapper泛型的Java Hadoop问题

带有ChainMapper泛型的Java Hadoop问题,java,generics,hadoop,mapreduce,Java,Generics,Hadoop,Mapreduce,您好,我目前面临Java泛型的一个问题: 我需要使用的方法具有此签名 static<K1,V1,K2,V2> void addMapper(JobConf job, Class<? extends Mapper<K1,V1,K2,V2>> klass, Class<? extends K1> inputKeyClass, Class<? extends V1> in

您好,我目前面临Java泛型的一个问题: 我需要使用的方法具有此签名

static<K1,V1,K2,V2> void addMapper(JobConf job, 
           Class<? extends Mapper<K1,V1,K2,V2>> klass, 
           Class<? extends K1> inputKeyClass, 
           Class<? extends V1> inputValueClass, 
           Class<? extends K2> outputKeyClass, 
           Class<? extends V2> outputValueClass, 
           boolean byValue, JobConf mapperConf) 
其中NameMapper的定义如下

public class NameMapper extends Mapper<Object, Object, Object, Object> { }
当我试图编译时,我得到以下错误

    src\MeanYear.java:107: error: method addMapper in class ChainMapper cannot be applied to given types;
                    ChainMapper.addMapper(conf, NameMapper.class, Object.class,
                               ^
      required: JobConf,Class<? extends Mapper<K1,V1,K2,V2>>,Class<? extends K1>,Class<? extends V1>,Class<? extends K2>,Class<? extends V2>,boolean,JobConf
      found: JobConf,Class<MeanYear.NameMapper>,Class<Object>,Class<Object>,Class<Object>,Class<Object>,boolean,JobConf
      reason: no instance(s) of type variable(s) K1,V1,K2,V2 exist so that argument type Class<MeanYear.NameMapper> conforms to formal parameter type Class<? extends Mapper<K1,V1,K2,V2>>
      where K1,V1,K2,V2 are type-variables:
        K1 extends Object declared in method <K1,V1,K2,V2>addMapper(JobConf,Class<? extends Mapper<K1,V1,K2,V2>>,Class<? extends K1>,Class<? extends V1>,Class<? extends K2>,Class<? extends V2>,boolean,JobConf)
        V1 extends Object declared in method <K1,V1,K2,V2>addMapper(JobConf,Class<? extends Mapper<K1,V1,K2,V2>>,Class<? extends K1>,Class<? extends V1>,Class<? extends K2>,Class<? extends V2>,boolean,JobConf)
        K2 extends Object declared in method <K1,V1,K2,V2>addMapper(JobConf,Class<? extends Mapper<K1,V1,K2,V2>>,Class<? extends K1>,Class<? extends V1>,Class<? extends K2>,Class<? extends V2>,boolean,JobConf)
        V2 extends Object declared in method <K1,V1,K2,V2>addMapper(JobConf,Class<? extends Mapper<K1,V1,K2,V2>>,Class<? extends K1>,Class<? extends V1>,Class<? extends K2>,Class<? extends V2>,boolean,JobConf)
src\MeanYear.java:107:错误:ChainMapper类中的方法addMapper无法应用于给定类型;
addMapper(conf,NameMapper.class,Object.class,
^

必选:JobConf,Class乍一看,我猜您是在混合新旧api包中的类:

ChainMapper
(从1.1.2开始)仅为旧API包
(org.apache.hadoop.mapred
)实现,尚未移植到新API包(
org.apache.hadoop.mapreduce


因此,
ChainMapper.addMapper
classThank!现在它可以工作了!但是我想知道在新的API中是否有类似的可能性,即能够连接多个map/reduce作业,而无需将其写入fs,而是将中间结果直接保存在内存中。。
JobConf conf = new JobConf(); JobConf nameYearConf = new JobConf(false);
    src\MeanYear.java:107: error: method addMapper in class ChainMapper cannot be applied to given types;
                    ChainMapper.addMapper(conf, NameMapper.class, Object.class,
                               ^
      required: JobConf,Class<? extends Mapper<K1,V1,K2,V2>>,Class<? extends K1>,Class<? extends V1>,Class<? extends K2>,Class<? extends V2>,boolean,JobConf
      found: JobConf,Class<MeanYear.NameMapper>,Class<Object>,Class<Object>,Class<Object>,Class<Object>,boolean,JobConf
      reason: no instance(s) of type variable(s) K1,V1,K2,V2 exist so that argument type Class<MeanYear.NameMapper> conforms to formal parameter type Class<? extends Mapper<K1,V1,K2,V2>>
      where K1,V1,K2,V2 are type-variables:
        K1 extends Object declared in method <K1,V1,K2,V2>addMapper(JobConf,Class<? extends Mapper<K1,V1,K2,V2>>,Class<? extends K1>,Class<? extends V1>,Class<? extends K2>,Class<? extends V2>,boolean,JobConf)
        V1 extends Object declared in method <K1,V1,K2,V2>addMapper(JobConf,Class<? extends Mapper<K1,V1,K2,V2>>,Class<? extends K1>,Class<? extends V1>,Class<? extends K2>,Class<? extends V2>,boolean,JobConf)
        K2 extends Object declared in method <K1,V1,K2,V2>addMapper(JobConf,Class<? extends Mapper<K1,V1,K2,V2>>,Class<? extends K1>,Class<? extends V1>,Class<? extends K2>,Class<? extends V2>,boolean,JobConf)
        V2 extends Object declared in method <K1,V1,K2,V2>addMapper(JobConf,Class<? extends Mapper<K1,V1,K2,V2>>,Class<? extends K1>,Class<? extends V1>,Class<? extends K2>,Class<? extends V2>,boolean,JobConf)
public class NameMapper extends MapReduceBase 
                        implements Mapper<Object, Object, Object, Object> { }
protected void map(Object key, Object value, Context context) { }
// to
public void map(Object key, Object value, OutputCollector collector,
                Reporter reporter) { }
public void close() { } // instead of cleanup(Context) {}
public void configure(JobConf conf) { } // instead of setup(Context) {}