我正在使用一个仅Map器的作业为solr生成索引。在我的mapper代码中,使用luceneapi org.apache.lucene.index.IndexWriter
并添加 org.apache.lucene.document.Document
到 IndexWriter
.
在 close()
方法,我正在使用 writer.forceMerge(1)
合并索引并最终关闭 IndexWriter
使用 writer.close()
在关闭之前将索引提交到本地文件系统。但是,有些任务会失败,因为提交过程有时需要很长时间(>600秒)。这常常导致工作失败。
问题似乎是任务在执行过程中无法将其进度通知tasktracker close()/writer.close()
方法调用最终导致tt终止任务。
为了防止这种情况发生,我开始在 close()
增加一个自定义计数器,通知作业跟踪器作业进度;然后我一看到这条线就停下来 writer.close()
呼叫已完成
这个临时的解决办法似乎暂时有效。但我想知道有没有更好的方法来解决这个问题?转移到cloudera搜索目前还不是一个选择。
设置:
solr版本:4.1
hadoop版本:cdh3u5
2条答案
按热度按时间xv8emn3q1#
您可以将“mapred.task.timeout”属性设置为更高的值。
默认情况下,这是600000毫秒。
jexiocij2#
简单地说,删除
writer.forceMerge(1)
.这迫使编写器将段向下合并到一个单独的段。这是一个非常昂贵的操作,即使你不合并到一个段,你几乎肯定不需要它!让合并策略处理何时为您合并段。
为了缩短这些操作的时间,您还可以做一些其他的事情,比如保持一个writer处于打开状态以供使用,而不是每次都打开一个新的writer。不过,我真的认为
forceMerge
将是目前为止最大的问题。了解更多原因
optimize
/forceMerge
只会伤害你:西蒙说:优化对你不好