zoukankan      html  css  js  c++  java
  • Nutch2.2.1 问题一:索引不能提交

    按照bin/nutch下的脚步一步一步的执行抓取:Inject,Generate,Fetcher,Parse,Updatedb,Solrindex,SolrDump.

    每部其实都可以打出 “bin/nutch $commands”命令来进行命令的提示,

    例如:"bin/nutch Inject" 注入URL,"bin/nutch Generate"生成抓取列表 。。。。。

    对于一个不太熟悉nutch的人来说,似乎可以按照这个步骤一步一来走,最终将索引提交给solr。

    但是,这个里面有个坑爹的事:bin/nutch updatedb ,你在执行的时候它其实没有提示你"bin/nutch updatedb -crawlId DBNAME",所以运行后,如果你

    不仔细看输出的日志,就以为update成功 了。呵呵,恭喜你进入坑里面了。。。在后面提交索引的时候怎么都提交不上去,让人头疼。。

    通过跟踪代码可以看到在solrindex的时候在org.apache.nutch.indexer.IndexerJob下的IndexerMapper类中的方法map代码如下:

    public void map(String key, WebPage page, Context context)
        throws IOException, InterruptedException {
          LOG.info("lvyf:begin indexmapper....");
          ParseStatus pstatus = page.getParseStatus();
          LOG.info("lvyf:parseStatus:"+String.valueOf(pstatus.getMinorCode()));
          LOG.info("lvyf结果 :"+(pstatus == null || !ParseStatusUtils.isSuccess(pstatus)
              || pstatus.getMinorCode() == ParseStatusCodes.SUCCESS_REDIRECT));
          if (pstatus == null || !ParseStatusUtils.isSuccess(pstatus)
              || pstatus.getMinorCode() == ParseStatusCodes.SUCCESS_REDIRECT) {
            return; // filter urls not parsed
          }
    
          Utf8 mark = Mark.UPDATEDB_MARK.checkMark(page);
          LOG.info("lvyf:mark结果:"+mark);
          if (!batchId.equals(REINDEX)) {
        	LOG.info("lvyf:不相等");
            if (!NutchJob.shouldProcess(mark, batchId)) {
              if (LOG.isDebugEnabled()) {
                LOG.debug("Skipping " + TableUtil.unreverseUrl(key) + "; different batch id (" + mark + ")");
              }
              return;
            }
          }
          LOG.info("lvyf:开始索引");
          NutchDocument doc = indexUtil.index(key, page);
          if (doc == null) {
        	LOG.info("lvyf:索引结果为null");
            return;
          }
          if (mark != null) {
        	LOG.info("lvyf:mark不为空");
            Mark.INDEX_MARK.putMark(page, Mark.UPDATEDB_MARK.checkMark(page));
            store.put(key, page);
          }
          LOG.info("lvyf:开始输出索引结果");
          context.write(key, doc);
        }
      }
    

      看到"Utf8 mark = Mark.UPDATEDB_MARK.checkMark(page);"这句了吗,你可以到数据库看下这个字段的值:

    1 hbase(main):002:0> get 'TCrawl_webpage','com.163.sports:http/15/0117/09/AG5D88EU00052UUC.html','mk'
    2 COLUMN                    CELL
    3  mk:__prsmrk__            timestamp=1422123943536, value=1422043649-437224786
    4  mk:_ftcmrk_              timestamp=1422044493751, value=1422043649-437224786
    5  mk:_gnmrk_               timestamp=1422043713328, value=1422043649-437224786
    6  mk:_injmrk_              timestamp=1422042207187, value=y
    7  mk:dist                  timestamp=1422042207187, value=0
    8 5 row(s) in 0.1160 seconds

    这里面没有"updmark",所以上面的mark结果为null,接着就return出去了。通过纠正后就变成这样了:

    1 hbase(main):003:0> get 'TCrawl_webpage','com.163.sports:http/15/0117/09/AG5D88EU00052UUC.html','mk'
    2 COLUMN                    CELL
    3  mk:_injmrk_              timestamp=1422042207187, value=y
    4  mk:_updmrk_              timestamp=1422177748005, value=1422043649-437224786
    5  mk:dist                  timestamp=1422042207187, value=0
    6 3 row(s) in 0.2070 seconds

    你再去solrindex发现可以提交上去了。问题就这样解决了

  • 相关阅读:
    玩转Web之easyui(一)-----easy ui datagird 分页
    【JavaEE基础】在Java中如何使用jdbc连接Sql2008数据库
    Android访问服务器(TOMCAT)乱码引发的问题
    工厂方法模式--结合具体例子学习工厂方法模式
    FatMouse' Trade
    简单工厂模式--结合实例学习简单工厂模式
    栈-----括号匹配+表达式计算
    Android控件之RadioGroup与RadioButton(单选控件)
    Android控件之CheckBox(复选框控件)
    Android控件之ToggleButton(多状态按钮)
  • 原文地址:https://www.cnblogs.com/lvfeilong/p/nutch221.html
Copyright © 2011-2022 走看看