注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Koala++'s blog

计算广告学 RTB

 
 
 

日志

 
 

Nutch 1.0 源代码分析[8] CrawlDb  

2010-03-24 18:44:08|  分类: Nutch |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

         再接下来Crawl类中的重要的一行就是:

crawlDbTool.update(crawlDb, new Path[] { segment }, true, true);

         下面就是updater的代码:

boolean additionsAllowed = getConf().getBoolean(

       CRAWLDB_ADDITIONS_ALLOWED, true);

update(crawlDb, segments, normalize, filter, additionsAllowed, false);

         只是得到了是不是可以再增加。

         Update的代码还是用map/reduce

public void update(Path crawlDb, Path[] segments, boolean normalize,

       boolean filter, boolean additionsAllowed, boolean force)

       throws IOException {

    JobConf job = CrawlDb.createJob(getConf(), crawlDb);

    job.setBoolean(CRAWLDB_ADDITIONS_ALLOWED, additionsAllowed);

    job.setBoolean(CrawlDbFilter.URL_FILTERING, filter);

    job.setBoolean(CrawlDbFilter.URL_NORMALIZING, normalize);

    for (int i = 0; i < segments.length; i++) {

       Path fetch = new Path(segments[i], CrawlDatum.FETCH_DIR_NAME);

       Path parse = new Path(segments[i], CrawlDatum.PARSE_DIR_NAME);

       if (fs.exists(fetch) && fs.exists(parse)) {

           FileInputFormat.addInputPath(job, fetch);

           FileInputFormat.addInputPath(job, parse);

       }

    }

 

    try {

       JobClient.runJob(job);

    }

 

    CrawlDb.install(job, crawlDb);

}

         将是否增加,是否对URL进行过滤,是否进行规范化进行设置。这里将crawl_fetchcrawl_parse目录加入,install函数只是换一下目录而已,换成先前的current目录,也就是要爬的URL数据库。

public static JobConf createJob(Configuration config, Path crawlDb)

       throws IOException {

    Path newCrawlDb = new Path(crawlDb, Integer.toString(new Random()

           .nextInt(Integer.MAX_VALUE)));

 

    JobConf job = new NutchJob(config);

    job.setJobName("crawldb " + crawlDb);

 

    Path current = new Path(crawlDb, CURRENT_NAME);

    if (FileSystem.get(job).exists(current)) {

       FileInputFormat.addInputPath(job, current);

    }

    job.setInputFormat(SequenceFileInputFormat.class);

 

    job.setMapperClass(CrawlDbFilter.class);

    job.setReducerClass(CrawlDbReducer.class);

 

    FileOutputFormat.setOutputPath(job, newCrawlDb);

    job.setOutputFormat(MapFileOutputFormat.class);

    job.setOutputKeyClass(Text.class);

    job.setOutputValueClass(CrawlDatum.class);

 

    return job;

}

         将先前的要爬的数据库current也作为输入目录,Mapper类为CrawlDbFilterReducer类为CrawlDbReducer,输出目录为一个临时目录。

         下面是CrawlDbFiltermap函数:

public void map(Text key, CrawlDatum value,

       OutputCollector<Text, CrawlDatum> output, Reporter reporter)

       throws IOException {

    String url = key.toString();

    if (urlNormalizers) {

       try {

           url = normalizers.normalize(url, scope); // normalize the url

       }

    }

    if (url != null && urlFiltering) {

       try {

           url = filters.filter(url); // filter the url

       }

    }

    if (url != null) { // if it passes

       newKey.set(url); // collect it

       output.collect(newKey, value);

    }

}

         这里对url进行规范化,过滤。

         CrawlDbReducer中的reduce代码比较长,似乎规则比较多,大意就是将这些URL合并,将CrawlDatum的值设置为合适的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  评论这张
 
阅读(1416)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017