设为首页 收藏本站
查看: 1289|回复: 0

[经验分享] Apache Nutch 1.3 学习笔记四(SegmentReader分析)

[复制链接]

尚未签到

发表于 2015-8-2 10:31:32 | 显示全部楼层 |阅读模式
  
  前面我们看了一下Generate的流程,它是为Fetch产生相应的fetchlist,这里想介绍一下Segment的查看工具SegmentReader类。

1. 命令介绍
  


  • bin/nutch readseg  

  •     Usage: SegmentReader (-dump ... | -list ... | -get ...) [general options]  
  
// 这里是一般的参数说明
  


  • * General options:  

  •         -nocontent  ignore content directory  

  •         -nofetch    ignore crawl_fetch directory  

  •         -nogenerate ignore crawl_generate directory  

  •         -noparse    ignore crawl_parse directory  

  •         -noparsedata    ignore parse_data directory  

  •         -noparsetext    ignore parse_text directory  
  
// 这里用于下载segment的内容,把其转换成文本格式,后面可以加General options参数,
// 看是不是过滤相应的目录
  


  • * SegmentReader -dump [general options]  

  •         Dumps content of a as a text file to .  



  •          name of the segment directory.  

  •           name of the (non-existent) output directory.  
  
// 列出相应的segment信息
  


  • * SegmentReader -list ( ... | -dir ) [general options]  

  •         List a synopsis of segments in specified directories, or all segments in  

  •         a directory , and print it on System.out  



  •          ...    list of segment directories to process  

  •         -dir        directory that contains multiple segments  
  
// 得到相对应的url的信息
  


  • * SegmentReader -get [general options]  

  •         Get a specified record from a segment, and print it on System.out.  



  •          name of the segment directory.  

  •             value of the key (url).  

  •             Note: put double-quotes around strings with spaces.  
  
2. 每一个命令的运行结果
2.1 bin/nutch readseg -dump  
  在本地运行其命令的结果如下:
// 下载一个segment
  


  • lemo@debian:~/Workspace/java/Apache/Nutch/nutch-1.3$ bin/nutch readseg -dump db/segments/20110822105243/ output  

  •     SegmentReader: dump segment: db/segments/20110822105243  

  •     SegmentReader: done  
  
        // 下载目录浏览
  


  • lemo@debian:~/Workspace/java/Apache/Nutch/nutch-1.3$ ls output  

  •     dump  
  
// 输出一部分下载信息
  


  • lemo@debian:~/Workspace/java/Apache/Nutch/nutch-1.3$ head output/dump   

  •     Recno:: 0  

  •     URL:: http://baike.baidu.com/  

  •     CrawlDatum::  

  •     Version: 7  

  •     Status: 67 (linked)  

  •     Fetch time: Mon Aug 22 10:58:21 EDT 2011  

  •     Modified time: Wed Dec 31 19:00:00 EST 1969  

  •     Retries since fetch: 0  
  
  我们来看一下其源代码是怎么写的,这个shell命令最终是调用org.apache.nutch.segment.SegmentReader中的dump方法,如下是这个方法的主要源代码:
  


  • // 这里生成一个MP任务  

  • JobConf job = createJobConf();  

  •    job.setJobName("read " + segment);  



  • // 查看General Options的参数,是否过滤相应的目录  

  •    if (ge) FileInputFormat.addInputPath(job, new Path(segment, CrawlDatum.GENERATE_DIR_NAME));  

  •    if (fe) FileInputFormat.addInputPath(job, new Path(segment, CrawlDatum.FETCH_DIR_NAME));  

  •    if (pa) FileInputFormat.addInputPath(job, new Path(segment, CrawlDatum.PARSE_DIR_NAME));  

  •    if (co) FileInputFormat.addInputPath(job, new Path(segment, Content.DIR_NAME));  

  •    if (pd) FileInputFormat.addInputPath(job, new Path(segment, ParseData.DIR_NAME));  

  •    if (pt) FileInputFormat.addInputPath(job, new Path(segment, ParseText.DIR_NAME));  



  • // 输入的目录文件格式,这里是SequenceFileInputFormat  

  •    job.setInputFormat(SequenceFileInputFormat.class);  

  • // 相应的Map与Reducer操作  

  •    job.setMapperClass(InputCompatMapper.class);  // 这里主要是把key转成UTF8格式,  

  •    job.setReducerClass(SegmentReader.class);        // 把相应的value对象反序列化成Text类型  



  •    Path tempDir = new Path(job.get("hadoop.tmp.dir", "/tmp") + "/segread-" + new java.util.Random().nextInt());  

  •    fs.delete(tempDir, true);  


  •    FileOutputFormat.setOutputPath(job, tempDir);   // 输出目录  

  •    job.setOutputFormat(TextOutputFormat.class);   // output text  

  •    job.setOutputKeyClass(Text.class);  

  •    job.setOutputValueClass(NutchWritable.class);  // 输出的value类型,这里要注意一下,因为上面Reducer是SegmentReader,其输出的类型为,而这里的value类型为NutchWritable,这里使用了强制类型转换。不知道这么做是为什么?  



  •    JobClient.runJob(job);  



  •    // concatenate the output  

  •    Path dumpFile = new Path(output, job.get("segment.dump.dir", "dump"));  



  •    // remove the old file  

  •    fs.delete(dumpFile, true);  

  •    FileStatus[] fsfstats = fs.listStatus(tempDir, HadoopFSUtil.getPassAllFilter());  

  •    Path[] files = HadoopFSUtil.getPaths(fstats);  



  •    PrintWriter writer = null;  

  •    int currentRecordNumber = 0;  

  • // 这里主要是合并上面的临时文件到正式的目录文件中output/dump  

  • // 并且加一些格式信息,使用append方法  

  •    if (files.length > 0) {  

  •     // create print writer with format  

  •      writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(fs.create(dumpFile))));  

  •      try {  

  •        for (int i = 0; i

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-93238-1-1.html 上篇帖子: 在linux下搭建svn服务器,不带apache 下篇帖子: 在Ubuntu下安装Apache、PHP、MySQL
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表