Nutch2.2.1 问题一:索引不能提交
2024-10-22 14:27:52
按照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);"这句了吗,你可以到数据库看下这个字段的值:
hbase(main)::> get 'TCrawl_webpage','com.163.sports:http/15/0117/09/AG5D88EU00052UUC.html','mk'
COLUMN CELL
mk:__prsmrk__ timestamp=, value=-
mk:_ftcmrk_ timestamp=, value=-
mk:_gnmrk_ timestamp=, value=-
mk:_injmrk_ timestamp=, value=y
mk:dist timestamp=, value=
row(s) in 0.1160 seconds
这里面没有"updmark",所以上面的mark结果为null,接着就return出去了。通过纠正后就变成这样了:
hbase(main)::> get 'TCrawl_webpage','com.163.sports:http/15/0117/09/AG5D88EU00052UUC.html','mk'
COLUMN CELL
mk:_injmrk_ timestamp=, value=y
mk:_updmrk_ timestamp=, value=-
mk:dist timestamp=, value=
row(s) in 0.2070 seconds
你再去solrindex发现可以提交上去了。问题就这样解决了
最新文章
- ElasticSearch 5学习(3)——单台服务器部署多个节点
- SQL Server Profiler使用教程,通俗易懂才是王道
- 在 Xcode 6 中使用矢量图( iPhone 6 置配 UI)
- 如何查看MySQL执行计划
- 【转】iPhone 6 屏幕揭秘
- Python 第十三篇之一:前端页面 js和dome
- 51Nod 1256 乘法逆元 扩展欧几里得
- 作为一个懒虫,如何优雅的使用windows
- Mac上webstorm与git仓库建立连接
- JDK1.7 HashMap 导致循环链表
- redis 启动停止脚本
- 【转】CSRF基本概念
- Repository模式与UnitOfWorks模式的运用
- MySQL的DML常用语法格式
- AspNetPager使用方法
- mySQL 教程 第5章 插入 更新与删除数据
- tomcat如何利用waf进行防护
- 【hive】关于浮点数比较的问题
- 《剑指Offer》题五十一~题六十
- 【解题报告】[动态规划]RQNOJ - PID82 / 又上锁妖塔