nutch程序对输入文件有两次处理:
(1)提交Job前在JobClient中,为了使输入不至于过大,程序调用切分函数(如下代码),对输入进行切分
if (job.getUseNewMapper()) {
maps = writeNewSplits(context, submitSplitFile);
} else {
maps = writeOldSplits(job, submitSplitFile);//说是划分分块
}
切分后的块被存入分布式文件系统中,然后LocalJobRunner会读取文件系统中的分块,然后按照分块的个数,启动对应数量的MapTask,MapTask负责对每个分块进行处理。
(2)MapTask在启动MapRunner程序前,会对自己对应的分块调用对应函数进行处理,得到需要的键值对(代码如下),
RecordReader<INKEY,INVALUE> in = isSkipping() ?
new SkippingRecordReader<INKEY,INVALUE>(rawIn, umbilical, reporter) :
new TrackedRecordReader<INKEY,INVALUE>(rawIn, reporter);
然后调用MapRunner程序,MapRunner程序会根据键值对的数量调用多次MapClass类的map函数,完成对数据的处理工作。