在hadoop中使用自定义计数器使map recuce作业保持活动状态?

tcbh2hod  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(346)

我正在使用一个仅Map器的作业为solr生成索引。在我的mapper代码中,使用luceneapi org.apache.lucene.index.IndexWriter 并添加 org.apache.lucene.document.DocumentIndexWriter .
close() 方法,我正在使用 writer.forceMerge(1) 合并索引并最终关闭 IndexWriter 使用 writer.close() 在关闭之前将索引提交到本地文件系统。但是,有些任务会失败,因为提交过程有时需要很长时间(>600秒)。这常常导致工作失败。
问题似乎是任务在执行过程中无法将其进度通知tasktracker close()/writer.close() 方法调用最终导致tt终止任务。
为了防止这种情况发生,我开始在 close() 增加一个自定义计数器,通知作业跟踪器作业进度;然后我一看到这条线就停下来 writer.close() 呼叫已完成
这个临时的解决办法似乎暂时有效。但我想知道有没有更好的方法来解决这个问题?转移到cloudera搜索目前还不是一个选择。
设置:
solr版本:4.1
hadoop版本:cdh3u5

xv8emn3q

xv8emn3q1#

您可以将“mapred.task.timeout”属性设置为更高的值。
默认情况下,这是600000毫秒。

jexiocij

jexiocij2#

简单地说,删除 writer.forceMerge(1) .
这迫使编写器将段向下合并到一个单独的段。这是一个非常昂贵的操作,即使你不合并到一个段,你几乎肯定不需要它!让合并策略处理何时为您合并段。
为了缩短这些操作的时间,您还可以做一些其他的事情,比如保持一个writer处于打开状态以供使用,而不是每次都打开一个新的writer。不过,我真的认为 forceMerge 将是目前为止最大的问题。
了解更多原因 optimize / forceMerge 只会伤害你:西蒙说:优化对你不好

相关问题