Сервер Solr не работает во время индексации (миллионы документов) с помощью Pysolr - PullRequest
0 голосов
/ 15 ноября 2018

Я пытался проиндексировать множество документов по Solr (~ 200 миллионов документов). Я использую Pysolr для индексирования. Однако сервер Solr продолжает работать при индексации (иногда после индексации 100 миллионов документов, иногда после ~ 180 миллионов документов он отличается). Я не уверен, почему это происходит, это из-за ограничения размера, связанного с предупреждением, которое я получаю при запуске сервера с запуском bin / solr?

* [ПРЕДУПРЕЖДЕНИЕ] * В настоящее время ограничение на количество открытых файлов составляет 1024. Во избежание сбоев в работе следует установить значение 65000.

Я использовал многопроцессорность при индексации с кусками 25000 (но я также пробовал с большими кусками и без многопроцессорности, и он все еще падал). Это потому, что в Solr отправлено слишком много запросов? Мой код Python ниже.

solr = pysolr.Solr('http://localhost:8983/solr/collection_name', always_commit=True)

def insert_into_solr(filepath):
    """ Inserts records into an empty solr index which has already been created."""
    record_number = 0
    list_for_solr = []
    with open(filepath, "r") as file:
        csv_reader = csv.reader((line.replace('\0', '') for line in file), delimiter='\t', quoting=csv.QUOTE_NONE)
        for paper_id, paper_reference_id, context in csv_reader:
            # int, int, string
            record_number += 1
            solr_record = {}
            solr_record['paper_id'] = paper_id
            solr_record['reference_id'] = reference_id
            solr_record['context'] = context
            # Chunks of 25000
            if record_number % 25000 == 0:
                list_for_solr.append(solr_record)
                try:
                    solr.add(list_for_solr)
                except Exception as e:
                    print(e, record_number, filepath)
                list_for_solr = []
                print(record_number)
            else:
                list_for_solr.append(solr_record)
        try:
            solr.add(list_for_solr)
        except Exception as e:
            print(e, record_number, filepath)

def create_concurrent_futures():
    """ Uses all the cores to do the parsing and inserting"""
    folderpath = '.../'
    refs_files = glob(os.path.join(folderpath, '*.txt'))
    with concurrent.futures.ProcessPoolExecutor() as executor:
        executor.map(insert_into_solr, refs_files, chunksize=1)

if __name__ == '__main__':
    create_concurrent_futures()

Я где-то читал, что стандартная установка Solr имеет жесткий лимит около 2,14 миллиарда документов. Что лучше использовать Solrcloud (который я никогда не настраивал), когда есть сотни миллионов документов? Поможет ли это с этой проблемой? (У меня также есть другой файл с 1,4 млрд. Документов, который необходимо проиндексировать после этого). У меня только один сервер, есть ли смысл пытаться настроить Solrcloud?

...