在Hadoop中使用自定义计数器来保持map - reduce作业的存活



我使用仅映射器的作业为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毫秒。

相关内容

  • 没有找到相关文章

最新更新