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