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

今天分析了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读取的输入键值对进行分析处理。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WitsMakeMen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值