在Hadoop1.1.2中,Mapper.java中的Mapper并不是一个接口,而是一个类;但是其作用就是一个接口,Mapper类是这个接口的默认实现;
我们在写自己map-reduce应用时,需要按照自己的需求实现自己的MyMapper类,我们实现的MyMapper类就必须是继承自这个Mapper类。
从源代码来看,原理如下所示:
在MapTask.java的runNewMapper函数中,有下面语句:
// make a mapper
org.apache.hadoop.mapreduce.Mapper<INKEY,INVALUE,OUTKEY,OUTVALUE> mapper =
ReflectionUtils.newInstance(taskContext.getMapperClass(), job);
其中ReflectionUtils.newInstance(taskContext.getMapperClass(), job)就是在从任务的配置中获得实际Mapper类的实例,这个实际的Mapper类就是我们在map-reduce应用中自己实现的MyMapper类。由于这里是将MyMapper类赋值给了一个org.apache.hadoop.mapreduce.Mapper<INKEY,INVALUE,OUTKEY,OUTVALUE>类型,由此可见MyMapper类是必须继承自Mapper的,否则就会发生编译时错误的。