您的位置:首页 > 其它

nutch1.2的generator如何获得输入的

2012-07-25 15:42 218 查看
今天分析了nutch中Generator如何读取上一步Injector生成的链接数据库CrawlDb,将nutch输入的原理进行总结。
(1)MapTask中通过获取job的InputFormat类,然后通过该类获得RecodReader,代码如下:

         RecordReader<INKEY,INVALUE> rawIn =job.getInputFormat().getRecordReader(inputSplit, job, reporter);

         所以要想控制输入就要编写自己的InputFormat类,然后重写getRecordReader()函数,生成自己的

         RecodReader类,RecordReader类是真正的读取输入的控制类。

(2)然后MapTask根据isSkipping判断,然后对RecordReader进行包装,代码如下:

RecordReader<INKEY,INVALUE> in = isSkipping() ?
new SkippingRecordReader<INKEY,INVALUE>(rawIn, umbilical, reporter) :
new TrackedRecordReader<INKEY,INVALUE>(rawIn, reporter);


(3)调用job的MapRunnerClass,生成MapRunnable类实例,代码如下:

MapRunnable<INKEY,INVALUE,OUTKEY,OUTVALUE> runner =  ReflectionUtils.newInstance(job.getMapRunnerClass(), job);

       运行runner,代码如下:

runner.run(in, new OldOutputCollector(collector, conf), reporter);

(4)Generator的job类的MapRunnable类型为MapRunner,他的configure函数会利用反射机制生成MapperClass类的实例,代码如下:

public void configure(JobConf job) {
this.mapper = ReflectionUtils.newInstance(job.getMapperClass(), job);
//increment processed counter only if skipping feature is enabled
this.incrProcCount = SkipBadRecords.getMapperMaxSkipRecords(job)>0 &&
SkipBadRecords.getAutoIncrMapperProcCount(job);
}


(5)MapRunner的run方法负责调用RecordReader获得输入键值对,然后调用MapperClass的map函数,对输入键值对进行处理,代码如下:

public void run(RecordReader<K1, V1> input, OutputCollector<K2, V2> output,
Reporter reporter)
throws IOException {
try {
// allocate key & value instances that are re-used for all entries
K1 key = input.createKey();//调用RecordReader的函数,获得输入的key值类型
V1 value = input.createValue();//调用RecordReader函数,获得输入的Value值类型

while (input.next(key, value)) {//调用input的next函数,获得输入文件中的输入键值对
// map pair to output
//    	System.err.println("org.apache.hadoop.mapred.MapRunner:执行map");
//    	System.err.println("Input.next="+value.toString());
mapper.map(key, value, output, reporter);//调用MapperClass的map函数对每个键值对进行处理
if(incrProcCount) {
reporter.incrCounter(SkipBadRecords.COUNTER_GROUP,
SkipBadRecords.COUNTER_MAP_PROCESSED_RECORDS, 1);
}
}
} finally {
mapper.close();
}
}

     解释:job的配置信息类conf没有给出输入的类型,所以不可能通过配置信息conf获得输入键值对的类型,通过分析RecordReader的createKey()和createValue()函数,发现RecordReader类通过读取输入文件分析产生输入键值对的类型,所以输入文件中给出了保存信息的键值对类型,所以conf配置文件中没有必要保存输入键值对类型。

(6)下一步就是你自己提供的MapperClass类,对RecorderReader读取的输入键值对进行分析处理。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  generator 算法