Я использую только работу картографа для создания индексов для Solr. В моем коде картографа я использую org.apache.lucene.index.IndexWriter
API Lucene и добавляю org.apache.lucene.document.Document
к IndexWriter
.
В методе close()
я использую writer.forceMerge(1)
для объединения индексов и, наконец, закрываю IndexWriter
, используя writer.close()
для фиксации индексов в локальной файловой системе перед закрытием. Однако некоторые задачи не выполняются, так как процесс фиксации иногда занимает много времени (> 600 секунд). Это часто приводит к провалу работы.
Похоже, проблема в том, что задачи не могут информировать TaskTracker о своем прогрессе во время выполнения вызова метода close()/writer.close()
, что в конечном итоге приводит к тому, что TT убивает задачи.
Чтобы этого не произошло, я запускаю поток в close()
, который увеличивает пользовательский счетчик, чтобы уведомить средство отслеживания заданий о ходе выполнения задания; затем я останавливаю этот поток, как только вызов writer.close()
завершится
Этот временный обходной путь пока работает. Но хотел бы знать, есть ли какие-нибудь лучшие способы решить эту проблему? Переход на Cloudera Search пока невозможен.
Установка:
Версия Solr: 4.1
Версия Hadoop: CDH3u5
forceMerge(1)
приведет только к увеличению времени запроса. Здесь используется подход «разделяй и властвуй», когда каждый преобразователь создает один и только один сегмент индекса; которые позже объединяются с использованием специального процесса слияния. (Здесь помогает меньше сегментов благодаряforceMerge()
) 01.07.2014