2014-06-30 15 views
0

我正在使用僅映射器作業來爲Solr生成索引。在我的映射代碼中,使用Lucene API的org.apache.lucene.index.IndexWriter並將org.apache.lucene.document.Document添加到IndexWriter
close()方法中,我使用writer.forceMerge(1)來合併索引,最後使用writer.close()關閉IndexWriter,在關閉之前將索引提交到本地文件系統。但是,由於提交過程有時需要很長時間(> 600秒),因此某些任務失敗。這通常會導致工作失敗。


問題似乎是任務無法通知TaskTracker他們在執行close()/writer.close()方法期間的進度最終導致TT終止任務。

爲了防止這種情況發生,我啓動了一個線程close(),它增加了一個自定義計數器來通知Job Tracker工作進度;那麼只要writer.close()呼叫完成,我就立即停止此線程

此臨時解決方法似乎現在可行。但想知道是否有更好的方法來解決這個問題?轉移到Cloudera Search目前不是一種選擇。在Hadoop中使用自定義計數器使Map-Recuce作業保持活動狀態?

設置:
Solr的版本:4.1
的Hadoop版本:CDH3u5

回答

0

簡單,刪除writer.forceMerge(1)

這迫使作者將分段合併到一個單獨的分段。這是一個極其昂貴的操作,即使您沒有合併到1段,並且您幾乎肯定不需要它!讓合併策略處理何時爲您合併段。

您還可以做其他一些事情來縮短這些操作的時間,例如讓作者開放使用,而不是每次都打開一個新的。真的,儘管如此,我認爲forceMerge將是到目前爲止這個問題的最大部分。

更多關於爲什麼optimize/forceMerge只能傷害你:Simon says: Optimize is bad for you

+0

您的意見是完全有效的。索引是從零開始構建的,作爲批處理作業的一部分,因此在構建時,重要的是我們擁有**最優化的**索引,即使它是以犧牲昂貴的操作。刪除'forceMerge(1)'調用只會導致查詢時間增加。這裏採用的方法是分而治之 - 在每個映射器中只生成一個索引段;後來使用專用合併過程進行組合。 (這裏'forceMerge()'有助於減少段數) – fuRy

0

您可以設置「mapred.task.timeout」屬性設置爲一個較高的值。

默認情況下,這是600000毫秒。

相關問題