Ошибка 409 при использовании streaming_bulk () - уверен, что документ включен только один раз. - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь загрузить большое количество документов - около 7 миллионов.

Я создал действия для каждого документа, который нужно добавить, и разделил их на около 260 файлов, по 30 тысяч документов каждый.

Вот формат действий:

a = someDocument with nesting

esActionFromFile = [{
'_index': 'mt-interval-test-9', 
'_type': 'doc', 
'_id': 5641254, 
'_source': a, 
'_op_type': 'create'}]

Я пытался использовать helpers.bulk, helpers.parallel_bulk и helpers.streaming_bulk и добился частичного успеха с использованием helpers.bulk и helpers.streaming_bulk.

Каждый раз, когда я запускаю тест, я удаляю, а затем воссоздаю индекс, используя:

# Refresh Index
es.indices.delete(index=index, ignore=[400, 404])
es.indices.create(index = index, body = mappings_request_body)

Когда я частично добился успеха - много документов загружено, но в итоге я получаю ошибку конфликта версии 409.

Мне известно, что могут возникать конфликты версий, когда у ES недостаточно времени для обработки удаления отдельных документов после выполнения удаления по запросу.

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

Используемое мной значение _id является первичным ключом из исходной базы данных , из которой я извлекаю данные - поэтому Я уверен, что они уникальны . Кроме того, я проверил, было ли непреднамеренное дублирование записей в моих массивах действий или файлы, из которых я их создал, и нет дубликатов .

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

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 27 апреля 2018

К ответу 409 должна быть приложена информация, которая должна точно сказать вам, что идет не так и какой документ вызвал это.

Другая причина, которая может вызвать это, будет retry - когда elasticsearch-py не сможет подключиться к кластеру, он снова отправит запрос на другой узел. В некоторых сложных сценариях может случиться так, что запрос будет отправлен дважды. Это особенно верно, если вы включили опцию retry_on_timeout.

...