Эффективные параметры массовой загрузки для 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.
Если эти меры не окажут никакого эффекта, ваше приложение индексирования также может стать узким местом. В этом случае вам придется пересмотреть архитектуру конвейера индексирования, чтобы разрешить параллельную работу нескольких индексирующих машин.