前面在讲InputFormat的时候,讲到了Mapper类是如何利用RecordReader来读取InputSplit中的K-V对的。
这一篇里,开始对Mapper.class的子类进行解读。

先回忆一下。Mapper有setup(),map(),cleanup()和run()四个方法。其中setup()一般是用来进行一些map()前的准备工作,map()则一般承担主要的处理工作,cleanup()则是收尾工作如关闭文件或者执行map()后的K-V分发等。run()方法提供了setup->map->cleanup()的执行模板。
在MapReduce中,Mapper从一个输入分片中读取数据,然后经过Shuffle and Sort阶段,分发数据给Reducer,在Map端和Reduce端我们可能使用设置的Combiner进行合并,这在Reduce前进行。Partitioner控制每个K-V对应该被分发到哪个reducer[我们的Job可能有多个reducer],Hadoop默认使用HashPartitioner,HashPartitioner使用key的hashCode对reducer的数量取模得来。
public void run(Context context) throws IOException, InterruptedException {
setup(context);
while (context.nextKeyValue()) {
map(context.getCurrentKey(), context.getCurrentValue(), context);
}
cleanup(context);
}从上面run方法可以看出,K/V对是从传入的Context获取的。我们也可以从

本文主要探讨Hadoop MapReduce中Mapper类的工作原理,包括setup、map、cleanup和run方法的功能。Mapper通过RecordReader读取InputSplit数据,经过Shuffle和Sort阶段,可能结合Combiner和Partitioner进行处理。文章还介绍了三个Mapper子类:TokenCounterMapper、InverseMapper和MultithreadedMapper。特别是MultithreadedMapper,它使用多线程执行Mapper任务,适合CPU密集型任务,但不适合IO密集型任务,因为可能造成线程等待IO,降低吞吐率。
最低0.47元/天 解锁文章
1864





