我使用仅映射器的作业为Solr生成索引。在我的映射器代码中,使用Lucene API的org.apache.lucene.index.IndexWriter
,并将org.apache.lucene.document.Document
添加到IndexWriter
。
在close()
方法中,我使用writer.forceMerge(1)
来合并索引,并最终关闭IndexWriter
,使用writer.close()
在关闭之前将索引提交到本地文件系统。但是,有些任务会失败,因为提交过程有时需要很长时间(> 600秒)。这常常导致工作的失败。
问题似乎是,在执行close()/writer.close()
方法调用期间,任务无法通知TaskTracker它们的进度,最终导致TT杀死任务。
为了防止这种情况发生,我在close()
中启动一个线程,该线程增加一个自定义计数器,以通知作业跟踪器的作业进度;然后在writer.close()
调用完成后立即停止此线程
这个临时的解决方案目前似乎有效。但是我想知道是否有更好的方法来解决这个问题?迁移到Cloudera搜索目前还不是一个选项。
<我>设置:
Solr版本:4.1
Hadoop版本:CDH3u5 我>
简单地,删除writer.forceMerge(1)
。
强制写入器将段合并为一个段。这是一个非常昂贵的操作,即使你没有合并到一个段,你几乎肯定不需要它!让合并策略处理何时为您合并段。
还可以做一些其他的事情来缩短这些操作的时间,比如保持一个写入器处于打开状态,而不是每次都打开一个新的。实际上,虽然,我认为forceMerge
将是迄今为止问题的最大部分。
更多关于为什么optimize
/forceMerge
只会伤害你:Simon说:优化对你不好
可以设置"mapred.task "。
默认值是600000毫秒。