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进行包装,代码如下:
(3)调用job的MapRunnerClass,生成MapRunnable类实例,代码如下:
运行runner,代码如下:
(4)Generator的job类的MapRunnable类型为MapRunner,他的configure函数会利用反射机制生成MapperClass类的实例,代码如下:
(5)MapRunner的run方法负责调用RecordReader获得输入键值对,然后调用MapperClass的map函数,对输入键值对进行处理,代码如下:
解释:job的配置信息类conf没有给出输入的类型,所以不可能通过配置信息conf获得输入键值对的类型,通过分析RecordReader的createKey()和createValue()函数,发现RecordReader类通过读取输入文件分析产生输入键值对的类型,所以输入文件中给出了保存信息的键值对类型,所以conf配置文件中没有必要保存输入键值对类型。
(6)下一步就是你自己提供的MapperClass类,对RecorderReader读取的输入键值对进行分析处理。
(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读取的输入键值对进行分析处理。
相关文章推荐
- nutch如何对种子链接输入产生键值对的?
- 如何获得Webapp的根项目路径 即ServletContext.getRealPath() 的输入参数要以"/"开头
- 在javascript中如何获得textbox输入光标的位置
- Extjs学习笔记<一>如何获得文本框输入的内容值
- 如何从内核层获得键盘输入的数据
- (第3讲)Java如何获得用户在控制台输入的东西(Scanner和BufferedReader的区别)
- MySql如何根据输入的id获得树形结构的子节点列表:使用自连+SUBSTRING_INDEX函数
- 在javascript中如何获得textbox输入光标的位置
- 悬而未决的问题:如何在Canvas上获得汉字输入
- 如何在controller中获得view实例
- 乌班图下如何获得超级权限
- 如何让tomcat输入http://localhost直接进入我指定项目的文件夹里面
- 一步一步跟我学易语言之如何较好的输入程序代码
- 检测input每次的输入是否合法遇到汉字输入就有问题,如何判断汉字是否已经输入到input内???
- 如何获得gem5以前的版本
- gridView中嵌套gridview 如何获得里面gridview的点击事件
- 【WPF】如何一键获得一类控件的Name值
- JQuery如何获得所有选中的checkbox
- 如何获得Image控件中的位图数组?
- 如何实现在内网输入公网IP地址可以直接访问内网服务器