在Hadoop中使用自定义计数器使Map Recce作业保持活动状态?

在Hadoop中使用自定义计数器使Map Recce作业保持活动状态?,hadoop,solr,lucene,mapreduce,Hadoop,Solr,Lucene,Mapreduce,我使用一个仅映射器的作业为Solr生成索引。在我的映射程序代码中,使用Lucene API的org.apache.Lucene.index.IndexWriter并将org.apache.Lucene.document.document添加到IndexWriter 在close()方法中,我使用writer.forceMerge(1)合并索引,最后使用writer.close()在关闭之前将索引提交到本地文件系统,关闭IndexWriter。但是,有些任务会失败,因为提交过程有时需要很长时间(>

我使用一个仅映射器的作业为Solr生成索引。在我的映射程序代码中,使用Lucene API的
org.apache.Lucene.index.IndexWriter
并将
org.apache.Lucene.document.document
添加到
IndexWriter

close()
方法中,我使用
writer.forceMerge(1)
合并索引,最后使用
writer.close()
在关闭之前将索引提交到本地文件系统,关闭
IndexWriter
。但是,有些任务会失败,因为提交过程有时需要很长时间(>600秒)。这常常导致工作失败。

问题似乎是,在执行
close()/writer.close()
方法调用期间,任务无法将其进度通知TaskTracker,最终导致TT终止任务。

为了防止这种情况发生,我在
close()
中启动了一个线程,该线程增加一个自定义计数器,以通知作业跟踪器作业进度;然后,只要
writer.close()调用完成,我就停止这个线程


这一临时解决办法目前似乎有效。但我想知道是否有更好的方法来解决这个问题?现在还不能选择使用Cloudera搜索

设置:
Solr版本:4.1
Hadoop版本:CDH3u5

只需删除
writer.forceMerge(1)

这将强制编写器将段合并为一个单独的段。这是一个极其昂贵的操作,即使您没有合并到一个段,您几乎肯定不需要它!让合并策略处理何时为您合并段

为了缩短这些操作的时间,您还可以做其他一些事情,比如保持一个writer处于打开状态以供使用,而不是每次都打开一个新的writer。但实际上,我认为到目前为止,
forceMerge
将是问题的最大部分

有关为什么
optimize
/
forceMerge
只会伤害您的更多信息:

您可以将“mapred.task.timeout”属性设置为更高的值


默认情况下,这是600000毫秒

您的评论完全正确。索引是作为批处理作业的一部分从零开始构建的,因此在构建时,我们必须拥有最优化的索引,即使它以昂贵的操作为代价。删除
forceMerge(1)
调用只会增加查询时间。这里采用的方法是分而治之——在每个映射器中生成一个且仅一个索引段;之后使用专用的合并过程将其合并。(由于
forceMerge()
,这里有助于减少段数)