Эффективное массовое сохранение предметов в Elasticsearch - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть несколько миллионов исторических объектов, которые нужно сохранить в Elasticsearch.Что было бы лучшим способом сделать это, не вдаваясь во внутренности эластичного поиска?Вот шаблон, который я сейчас использую:

ACTIONS = []
NUM_ACTIONS_TO_BULK = 10000
for num, item in enumerate(HISTORY_DATA.values()):
    ACTIONS.append({
        "_index": ES_INDEX_NAME,
        "_type": "_doc",
        "_id": item.pop('_id'),
        "_source": item
    })

    # Save every 10k and again at the end
    if (len(ACTIONS) == NUM_ACTIONS_TO_BULK) or (num == len(HISTORY_DATA) - 1):
        log.info('%s/%s - Saving %s items to ES...' % (num, len(HISTORY_DATA), len(ACTIONS))
        _ = helpers.bulk(self.es, ACTIONS)
        ACTIONS = []

Выше сохраняет его в ES в пакетах по 10k.Это лучший / самый эффективный способ сохранить вещи в ES?Например, что если я попытался сохранить все объекты 15M непосредственно в ES с помощью helpers.bulk - это будет разделить элементы на части или попытаться сохранить все сразу?Похоже, я что-то упустил из вышеперечисленного?

1 Ответ

0 голосов
/ 25 сентября 2018

Несколько вещей, которые нужно попробовать при использовании Bulk API.Поиграйте с количеством документов, которые вы отправляете за раз.Все зависит от среднего размера документа.Есть несколько хороших рекомендуемых отправных точек , перечисленных здесь .Иногда 100 за раз будет быстрее, чем 1000 за один раз.Кроме того, если вы можете сделать ваше приложение многопоточным, сделайте это.Если у вас есть несколько узлов, которые могут писать, воспользуйтесь этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...