Эффективные параметры массовой загрузки для Elasticsearch в Python

Я пытаюсь загрузить большой объем данных в Elasticsearch с помощью Python. Для этой цели я использую помощник по массовому API и разработал функцию, которая выглядит примерно так:

      def __load(self, docs, index):
    try:
        # begin load
        logging.info("Begin indexing documents")
        progress = tqdm.tqdm(unit="docs", total=len(docs))
        successes = 0

        # load each document and update status
        for ok, action in streaming_bulk(
                client=self.es_client, index=index, actions=docs,
        ):
            progress.update(1)
            successes += ok
        logging.info("Indexed %d/%d documents" % (successes, len(docs)))
        logging.info("Data successfully loaded to " + index + " index")

        return "COMPLETED", len(docs)
    except:
        return "FAILED", 0

Это та часть, где происходит фактическое употребление,

          for ok, action in streaming_bulk(
            client=self.es_client, index=index, actions=docs,
    ):
        progress.update(1)
        successes += ok

Теперь каждый из моих документов содержит довольно большой объем данных (у меня есть несколько полей, которые представляют собой большие строки), и я заметил, что этот процесс приема идет довольно медленно. Я загружаю данные по частям, и индексирование 10000 документов занимает чуть больше минуты.

Есть ли более эффективный способ сделать это? Я пытаюсь ускорить процесс.

1 ответ

Пожалуйста, взгляните на документ Tune для скорости индексации . Простым (хотя и несколько ограниченным) способом распараллеливания может быть использование parallel_bulk.

Если эти меры не окажут никакого эффекта, ваше приложение индексирования также может стать узким местом. В этом случае вам придется пересмотреть архитектуру конвейера индексирования, чтобы разрешить параллельную работу нескольких индексирующих машин.

Другие вопросы по тегам