Generator分析
Generator的功能主要是将注入的URL按照一定的规则生产一系列CrawlDb的子集。这里的规则包括:抓取时间是否符合要求,是否符合设定过滤规则,根据页面评分进行排序,根据URL的host/ip/domain划分子集,是否超过设定的generate最大值(就是Crawl命令中的topN值)等。
generate方法主要包括三个job的执行:
第一个job的map和reduce均由内部类Selector类实现,另外还包含了Partitioner类的getPartition方法。
map方法所干的活:
根据URLFilters对url进行过滤,并比较抓取时间看是否符合要求,过滤掉低于generate.min.score参数设定分数值的URL,然后计算url的评分并按照评分降序排列。
分别对应下面代码行:
filters.filter(url.toString())
schedule.shouldFetch(url, crawlDatum, curTime)
scfilters.generatorSortValue(key, crawlDatum, sort);
getPartition方法所干的活:
该接口最终由URLPartitioner类实现,主要是对URL的host/domain/Ip把URL划分成很多子集,这样对后面的抓取有好处。比如可以避免对同一个站点的多个线程同时发起请求。
reduce所干的活:
判断产生的URL数量是否超过命令行输入中的topN值,如果超过了就停止。其他一些参数的限制,如:generate.max.count。输出为<Text,SelectorEntry>作为中间结果。
第二个job的map由SelectorInverseMapper类实现,而reduce方法由PartitionReducer类实现。具体功能:TODO,需进一步分析!
第三个job的map和reduce都由CrawlDbUpdater实现。该任务是否执行取决于主要generate.update.crawldb配置参数的值,默认不执行。